การใช้คำสั่ง“ ส่งออก” คืออะไร?


12

ฉันสร้างตัวแปรสภาพแวดล้อมในหน้าต่างเทอร์มินัลหนึ่งและพยายามที่จะสะท้อนในหน้าต่างเทอร์มินัลอื่น ที่แสดงอะไร

$TEST=hello

หลังจากนั้นฉันส่งออกและลองอีกครั้งechoในหน้าต่างเทอร์มินัลอื่น ผลลัพธ์เหมือนเดิม

export TEST 

แต่ถ้าฉันรันรหัสเดียวกันที่~/.profileตัวแปรล็อกอิน (ต่อท้ายรหัสไปยังไฟล์) สามารถใช้หน้าต่างเทอร์มินัลใดก็ได้ เกิดอะไรขึ้นที่นี่ อะไรคือความแตกต่างระหว่างการเรียกใช้งานโค้ดในเครื่องเทอร์มินัลและการเรียกใช้งานเหมือนกันเมื่อทำการล็อกอิน

คำตอบ:


26

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

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


1

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

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

ตอนนี้เชลล์มีตัวแปรมากมายที่สามารถดูได้set(ในเชลล์ของ Bourne Shell type, ไม่ทราบเกี่ยวกับ C เชลล์) ตัวแปรเหล่านี้ไม่ใช่ตัวแปรสภาพแวดล้อมยกเว้นว่าเป็นexported envตัวแปรสภาพแวดล้อมที่สามารถดูได้ด้วย หากคุณเรียกใช้โปรแกรมจากบรรทัดคำสั่งเชลล์โปรแกรมจะสืบทอดตัวแปรสภาพแวดล้อมจากเชลล์ เช่นเดียวกันสำหรับโปรแกรมที่เรียกใช้จากเชลล์สคริปต์

ดังนั้นเมื่อเข้าสู่ระบบจะมีเชลล์ที่อ่านข้อมูลโปรไฟล์ (เช่น~/.profile) และสืบทอดให้กับเด็ก ๆ ทุกคนหลานและอื่น ๆ นี่คือวิธีที่การตั้งค่าตัวแปรสภาพแวดล้อมลดลงจากเชลล์ล็อกอินหรือสคริปต์ล็อกอินไปยังโปรแกรมอื่น ๆ ทั้งหมดที่เปิดตัวภายในเซสชันการเข้าสู่ระบบ

ฉันสร้างตัวแปรสภาพแวดล้อมในหน้าต่างเทอร์มินัลหนึ่งและพยายามที่จะสะท้อนในหน้าต่างเทอร์มินัลอื่น ที่แสดงอะไร

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

$TEST=hello

สิ่งนี้ไม่น่าจะทำงานได้เว้นแต่ว่าการขยายตัวของตัวแปรจะถูกปิดใช้งานหรือ$TESTมีค่าที่เหมาะสมอยู่แล้ว หากคุณต้องการกำหนดให้helloกับตัวแปรTESTคุณต้องพูดTEST=hello(หมายเหตุ: ไม่$)

หลังจากนั้นฉันส่งออกและลองอีกครั้งechoในหน้าต่างเทอร์มินัลอื่น ผลลัพธ์เหมือนเดิม

นี่เป็นผลลัพธ์ที่คาดหวังอีกครั้ง

แต่ถ้าฉันรันรหัสเดียวกันที่~/.profileตัวแปรล็อกอิน (ต่อท้ายรหัสไปยังไฟล์) สามารถใช้หน้าต่างเทอร์มินัลใดก็ได้

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

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