มีการกำหนดขอบเขตโดยกระบวนการ
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
ที่สร้างกระบวนการเด็ก เพราะผมไม่ได้ใช้กระบวนการเด็กไม่ได้รับของเปลือกexport
GEM_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
เปลี่ยนค่าสำหรับตัวเองเท่านั้น มันเกี่ยวกับใช่มั้ย