การส่งออกทำอะไรใน BASH [ซ้ำ]


67

ซ้ำกันได้:
ความแตกต่างระหว่าง“ a = b” และ“ ส่งออก a = b” ใน bash

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

export foo=5

และเมื่อใดที่ฉันไม่ควรส่งออกตัวแปร


นี่คือลิงค์ไปยังคำถามที่มีประโยชน์อย่างน้อยหนึ่งคำถามในหัวข้อนี้: superuser.com/questions/143413/linux-environment-variables ... เนื่องจากแดกดันคำถามนี้เป็นคำถามแรกที่โผล่ขึ้นมาบน Google สำหรับการค้นหาของฉันในการส่งออกในทุบตี
Ogre Psalm33

1
นอกจากนี้: superuser.com/questions/18988/...
Ogre Psalm33

การใช้งานทั่วไปอย่างหนึ่งคือการเพิ่ม export คำสั่งเป็น. bashrc / .bash_profile เพื่อสร้างตัวแปรโกลบอลแบบถาวรที่คล้ายกับ $HOME.
Evan Plaice

ระวังเรื่องนี้มีมากขึ้นกว่าตอนแรกจะปรากฏขึ้น ฉันเชิญคุณตรวจสอบคำตอบของฉัน
jasonleonhard

คำตอบ:


14

จาก man bash:

สิ่งแวดล้อม

เมื่อโปรแกรมถูกเรียกมันจะได้รับอาร์เรย์ของสตริงที่เรียกว่า   สิ่งแวดล้อม นี่คือรายการของ   คู่ค่าชื่อของแบบฟอร์ม   ชื่อ = ค่า

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


57
IMHO คัดลอกข้อความที่ตัดตอนมาจากเอกสารโดยไม่ต้องพยายามอธิบายเพิ่มเติมใด ๆ
Artur

23
ข้อความที่ตัดตอนมานั้นไม่ชัดเจนและตรงไปตรงมาฉันไม่เข้าใจสิ่งที่เกิดขึ้น
Trismegistos

4
@Artur: ตรงกันข้าม: หาก (เอกสารที่ตัดตอนมาจาก) ตอบคำถามฉันไม่ต้องการคำอธิบายเพิ่มเติม
René Nyffenegger

1
@ RenéNyffenegger แต่ดูเหมือนว่ามันจะไม่ อย่างน้อยฉันไม่ได้รับจนกว่าฉันจะอ่านคำตอบโดย BloodPhilia ซึ่งควรทำเครื่องหมายว่าเป็นที่ยอมรับ
Vladislav Rastrusny

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

89

ตัวแปรที่เอ็กซ์พอร์ตจะถูกส่งผ่านไปยังกระบวนการลูกตัวแปรที่ไม่เอ็กซ์พอร์ตจะทำไม่ได้


คุณสามารถชี้ไปที่เอกสารใด ๆ ที่มีผลกระทบ ฉันกำลังมองหาข้อมูลมากกว่านั้น ตัวอย่างเช่นตัวแปรจะต้องถูกส่งออกเพียงครั้งเดียวหรือคุณต้องการส่งออกหลังจากการเปลี่ยนแปลงทุกครั้งเป็นต้น
Chas. Owens

1
คุณสามารถตรวจสอบสิ่งนี้: superuser.com/questions/143413/linux-environment-variables/...
BloodPhilia

3
คุณสามารถยืนยันสิ่งนี้ได้โดยการเพิ่มบางอย่างลงในพา ธ (พูดกับ PYTHONPATH ) แล้วสังเกตว่าแม้ว่าคุณจะสามารถ echo $PYTHONPATH มันไม่ได้รับการยอมรับจาก python หรือ bash script จนกว่าคุณจะ export มัน
Kaushik Ghose

ดูเหมือนว่าคำตอบนี้จะไม่เป็นความจริง แต่อย่างใด ยกตัวอย่างเช่น Bash sub-shells เป็น child-processes (อ้างอิงจาก $BASHPID ) และยังคุณสามารถอ่านตัวแปรที่ไม่ได้เอ็กซ์พอร์ตจากพาเรนต์เชลล์ หลักฐานง่าย ๆ : x="y"; echo "$BASHPID: $x"; (echo "$BASHPID: $x") ฉันเดาว่านี่เป็นกรณีพิเศษที่เกิดขึ้นเมื่อกระบวนการย่อยเป็น sub-shell
JepZ

19

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

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

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