เหตุใดฉันจึงต้อง "ซอร์ส. โปรไฟล์" ในทุกเทอร์มินัลที่ฉันเปิด


10

เมื่อเราเปลี่ยนตัวแปรบางอย่างในในอูบุนตูแล้วเรารันคำสั่ง~/.profile source .profileจากนั้นการเปลี่ยนแปลงจะมีผลเฉพาะในเทอร์มินัลนี้ ถ้าเราเปิดเทอร์มินัลใหม่เราต้องดำเนินการคำสั่งsource .profileอีกครั้ง ดังนั้นดูเหมือนว่าเทอร์มินัลที่แตกต่างกันมีสภาพแวดล้อมของตัวเองแม้ว่าพวกเขาอาจเป็นผู้ใช้เดียวกัน

อะไรคือข้อดีของการทำให้เครื่องทุกเครื่องมีเส้นทางสภาพแวดล้อมของตัวเอง? ดูเหมือนว่าจะดีกว่าถ้าเทอร์มินัลอื่นซึ่งเป็นของผู้ใช้รายเดียวกันใช้ตัวแปรสภาพแวดล้อมเดียวกัน



หากการเข้าสู่ระบบของคุณ "เชลล์" เป็น GUI คุณจะไม่สามารถตั้งค่า var ในสคริปต์การเข้าสู่ระบบของ sh แทนการใช้ GUI ของคุณได้
ikegami

คำตอบ:


14

เหตุผลนี้คือที่~/.profileมาจากเปลือกหอยเข้าสู่ระบบเท่านั้น เมื่อคุณเปิดหน้าต่างเทอร์มินัลใหม่เชลล์ที่เริ่มต้นคือเชลล์ที่ไม่ใช่การล็อกอินตามค่าเริ่มต้น หากคุณออกจากระบบและลงชื่อเข้าใช้ใหม่การเปลี่ยนแปลง~/.profileจะมีผลในเทอร์มินัลทั้งหมดของคุณเนื่องจาก~/.profileจะมีที่มาเมื่อคุณล็อกอินเข้าสู่เซสชันของคุณ

ไม่ใช่กรณีที่เทอร์มินัล windows ที่แตกต่างกันมีสภาพแวดล้อมที่แตกต่างกัน แต่การจัดหา~/.profileดำเนินการเฉพาะ~/.profileในเชลล์ปัจจุบัน (นั่นคือสิ่งที่sourceคำสั่งทำ)

ในทางตรงกันข้ามการเปลี่ยนแปลงที่~/.bashrcจะมีผลกับหน้าต่างเทอร์มินัลใหม่ที่คุณเปิดทันทีหรือ Bash shell ใด ๆ ที่คุณเริ่มต้นด้วยการพิมพ์bashเพราะมันมาจาก Bash shell แบบโต้ตอบทั้งหมด


3

ตัวแปรสภาพแวดล้อมไม่ได้มีไว้สำหรับการตั้งค่าของผู้ใช้เท่านั้น เป็นกลไกทั่วไปสำหรับการสื่อสารข้อมูลการตั้งค่าที่หลากหลายจากกระบวนการหลักไปจนถึงกระบวนการย่อยที่เริ่มต้น

มีหลายกรณีที่กระบวนการจะตั้งค่าตัวแปรสภาพแวดล้อมเฉพาะเพื่อที่จะมีอิทธิพลต่อกระบวนการที่เพิ่งเริ่มต้น ตัวอย่างเช่นสคริปต์อาจรีเซ็ตการตั้งค่าโลแคลสำหรับคำสั่งที่เริ่มต้นโดยเจตนาเพื่อให้สามารถแยกเอาต์พุตจากพวกเขา บิลด์สคริปต์สำหรับแพ็กเกจซอฟต์แวร์ขนาดใหญ่จำนวนมากใช้การเรียกใช้แบบซ้อนของการmakeประสานงานซึ่งกันและกันผ่านตัวแปรสภาวะแวดล้อม เครื่องมือพิเศษอาจจำเป็นต้องเปลี่ยนสภาพการทำงานของโปรแกรมอื่น ๆ ที่พวกเขาเริ่มต้นด้วยการเล่นกลกับ $ LD_PRELOAD หรือ $ PATH

หากบางสิ่งที่ผู้ใช้ทำในหน้าต่างที่แตกต่างกันในขณะที่การคอมไพล์แบบยาวกำลังทำงานอยู่ในอีกระบบหนึ่งจะเปลี่ยนตัวแปรสภาพแวดล้อมของกระบวนการทั้งหมดของเขาอย่างไม่น่าเชื่อเบื้องหลังความบ้าคลั่งและความโกลาหล

ตัวแปรสภาพแวดล้อมอื่น ๆ มีข้อมูลเกี่ยวกับเซสชั่นเฉพาะที่กระบวนการเริ่มต้นโปรแกรมคาดว่า $ TERM เพื่ออธิบายชุดคำสั่งของเทอร์มินัลเฉพาะ (หรือเทอร์มินัลอีมูเลเตอร์) ที่พวกเขาเชื่อมต่อ การตั้งค่าทั่วไปต่อผู้ใช้จะทำให้ไม่สามารถเข้าสู่ระบบเดียวกันด้วยเทอร์มินัลชนิดต่าง ๆ แม้ว่าคุณจะมีฮาร์ดแวร์เทอร์มินัลเพียงชิ้นเดียวและไม่เคยล็อกอินจากระยะไกลโปรแกรมเช่นscreenขึ้นอยู่กับการตั้งค่า $ TERM ที่แตกต่างกันสำหรับกระบวนการที่ทำงานภายในเซสชัน

คำถามที่ดีกว่าคือทำไมเราจึงใช้กลไกการสื่อสารแบบ process-to-subprocess สำหรับการตั้งค่าผู้ใช้แทนที่จะเป็นฐานข้อมูลต่อผู้ใช้

คำตอบ: เพราะมันทำงานได้ดีพอและประโยชน์ของการทำฐานข้อมูลต่อผู้ใช้จะไม่มากพอว่าการทำงานของการเปลี่ยนแปลงทุกอย่างที่จะใช้ที่แทนตัวแปรสภาพแวดล้อมที่จะทำ

(ฉันจะคิดว่าการตั้งค่าน้อยมากที่มีจะไม่เป็นกรณีการใช้งานบางอย่างที่มันสะดวกที่จะเปลี่ยนพวกเขาเพียงแค่สำหรับการรันสคริปต์เดียวเช่น. ดังนั้นเพื่อไม่ให้การทำงานที่สูญเสียทุกอย่างยังคงต้องเป็นoverridableโดย ตัวแปรสภาพแวดล้อมซึ่งส่งผลให้เกิดความซับซ้อนเพิ่มขึ้นและผู้ใช้ที่สับสนมากขึ้น)

มันไม่ได้หมายความว่าทางเลือกที่ไม่อยู่ ตัวอย่างเช่นทรัพยากร X เป็นต่อเซสชันการแสดงผลมากกว่าต่อกระบวนการ แต่พวกเขายากที่จะเข้าถึงสำหรับโปรแกรมบรรทัดคำสั่ง - และโปรแกรมบรรทัดคำสั่งจะต้องทำงานให้กับการเข้าสู่ระบบจากระยะไกลที่ไม่ได้มีเซิร์ฟเวอร์ X เพื่อเชื่อมต่อกับ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.