มีการกำหนดขอบเขตโดยกระบวนการ
answerers อื่น ๆ ที่ช่วยให้ผมเข้าใจว่าขอบเขตตัวแปรเปลือกเป็นเรื่องเกี่ยวกับกระบวนการและลูกหลานของพวกเขา
เมื่อคุณพิมพ์คำสั่งเหมือนlsในบรรทัดคำสั่งคุณจะใช้กระบวนการเพื่อเรียกใช้lsโปรแกรม กระบวนการใหม่มีเชลล์ของคุณเป็นพาเรนต์
กระบวนการใด ๆ สามารถมีตัวแปร "ท้องถิ่น" ของตัวเองซึ่งไม่ได้ถูกส่งผ่านไปยังกระบวนการลูก นอกจากนี้ยังสามารถตั้งค่าตัวแปร "สภาพแวดล้อม" ซึ่ง ได้แก่ การใช้exportสร้างตัวแปรสภาพแวดล้อม ในกรณีใดกรณีหนึ่งกระบวนการที่ไม่เกี่ยวข้อง (เพียร์ของต้นฉบับ) จะไม่เห็นตัวแปร เราควบคุมเฉพาะสิ่งที่กระบวนการลูกเห็น
สมมติว่าคุณมี bash shell ซึ่งเราจะเรียกว่า A คุณพิมพ์bashซึ่งจะสร้าง child child bash shell ซึ่งเราจะเรียก B สิ่งที่คุณเรียกexportใน A จะยังคงถูกตั้งค่าใน B
ขณะนี้ใน B FOO=bคุณพูด หนึ่งในสองสิ่งจะเกิดขึ้น:
- ถ้า B ไม่ได้รับ (จาก A) ตัวแปรสภาพแวดล้อมที่เรียกว่า
FOOมันจะสร้างตัวแปรท้องถิ่น เด็ก ๆ ของ B จะไม่ได้รับมัน (ยกเว้นว่าจะโทร B export)
- ถ้า B ไม่ได้รับ (จาก A) ตัวแปรสภาพแวดล้อม callled
FOOก็จะแก้ไขได้สำหรับตัวเองและลูก ๆ ของมันคดเคี้ยวภายหลัง Children of B จะเห็นค่าที่ B กำหนดไว้ อย่างไรก็ตามสิ่งนี้จะไม่ส่งผลกระทบต่อ A เลย
นี่คือตัวอย่างรวดเร็ว
FOO=a # set "local" environment variable
echo $FOO # 'a'
bash # forks a child process for the new shell
echo $FOO # not set
exit # return to original shell
echo $FOO # still 'a'
export FOO # make FOO an environment variable
bash # fork a new "child" shell
echo $FOO # outputs 'a'
FOO=b # modifies environment (not local) variable
bash # fork "grandchild" shell
echo $FOO # outputs 'b'
exit # back to child shell
exit # back to original shell
echo $FOO # outputs 'a'
ทั้งหมดนี้อธิบายถึงปัญหาดั้งเดิมของฉัน: ฉันตั้งค่าGEM_HOMEในเปลือกของฉัน แต่เมื่อฉันเรียกว่าbundle installที่สร้างกระบวนการเด็ก เพราะผมไม่ได้ใช้กระบวนการเด็กไม่ได้รับของเปลือกexportGEM_HOME
ยกเลิกการส่งออก
คุณ "ยกเลิกการส่งออก" ตัวแปรสามารถ - ป้องกันไม่ให้มันจากการถูกส่งผ่านไปยังเด็ก - export -n FOOโดยใช้
export FOO=a # Set environment variable
bash # fork a shell
echo $FOO # outputs 'a'
export -n FOO # remove environment var for children
bash # fork a shell
echo $FOO # Not set
exit # back up a level
echo $FOO # outputs 'a' - still a local variable
FOO=barว่าจะตั้งค่าสำหรับกระบวนการเปลือกปัจจุบัน ถ้าฉันเรียกใช้โปรแกรมเช่น (bundle install) นั่นจะเป็นการสร้างกระบวนการลูกซึ่งไม่สามารถเข้าถึงFOOได้ แต่ถ้าฉันบอกว่าexport FOO=barกระบวนการของเด็ก (และลูกหลานของมัน) จะสามารถเข้าถึงมันได้ หนึ่งในนั้นสามารถเรียกexport FOO=buzzเพื่อเปลี่ยนค่าสำหรับการสืบทอดหรือเพียงแค่FOO=buzzเปลี่ยนค่าสำหรับตัวเองเท่านั้น มันเกี่ยวกับใช่มั้ย