การตั้งค่าตัวแปรสภาพแวดล้อม Linux


9

ฉันใช้ Red Hat Linux Enterprise 5 อยู่ ฉันมักจะใช้คำสั่งส่งออกเพื่อตั้งค่าตัวแปรสภาพแวดล้อม

มีวิธีอื่นในการตั้งค่าตัวแปรสภาพแวดล้อมและอะไรคือข้อดี / ข้อเสียของมัน

คำตอบ:


16

นี่เป็นข้อความที่ตัดตอนมาจากหน้า Bash man:

ส่งออก [-fn] [ชื่อ [= คำ]] ...
ส่งออก -p
ชื่อที่ให้มามีการทำเครื่องหมายสำหรับการส่งออกโดยอัตโนมัติไปยังสภาพแวดล้อมของคำสั่งดำเนินการในภายหลัง หากระบุอ็อพชัน -f ชื่อจะอ้างถึงฟังก์ชัน ...

หากคุณต้องการตัวแปรในสภาพแวดล้อมปัจจุบันไม่จำเป็นต้องใช้การส่งออก

var=value

แก้ไข:

ไม่มีการส่งออก: สภาพแวดล้อมปัจจุบันเท่านั้น ด้วยการส่งออก: สภาพแวดล้อมปัจจุบันและสภาพแวดล้อมของเด็ก

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

$ var1=123
$ export var2=456
$ echo "parent [$var1] [$var2] [$var3]"
parent [123] [456] []
$ var3=789 bash -c 'echo "child [$var1] [$var2] [$var3]"; var1=111; var2=222; var3=333; echo "child [$var1] [$var2] [$var3]"'
child [] [456] [789]
child [111] [222] [333]
$ echo "parent [$var1] [$var2] [$var3]"
parent [123] [456] []

หลังจากเสียงสะท้อนแรก ( echo "parent...") คุณเห็น "123" และ "456" เพราะทั้งคู่var1และvar2ทำงานในสภาพแวดล้อมปัจจุบัน คุณไม่เห็นค่าvar3เพราะยังไม่ได้ตั้งค่า

หลังจากบรรทัดที่เริ่ม " var3=..." คุณไม่เห็นค่าvar1เพราะไม่ถูกส่งออก คุณทำดูค่าvar2เพราะมันได้รับการส่งออก คุณจะเห็นความคุ้มค่าvar3เพราะมันถูกกำหนดให้มีสภาพแวดล้อมที่เด็กเท่านั้น

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

ใน "สคริปต์" ค่าของตัวแปรจะเปลี่ยนไป ตอนนี้มันจะส่งออกค่าใหม่เหล่านั้น

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


"ในสภาพแวดล้อมปัจจุบัน" หมายถึงอะไร สคริปต์ทุบตีปัจจุบันหรือ
George2

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

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

1
@ George2: ดูคำตอบที่แก้ไขของฉันสำหรับข้อมูลเพิ่มเติม
หยุดชั่วคราวจนกว่าจะมีการแจ้งให้ทราบต่อไป

3

คุณพูดอย่างนั้น

ฉันมักจะใช้คำสั่งส่งออกเพื่อตั้งค่าตัวแปรสภาพแวดล้อม

ดูเหมือนว่าคุณกำลังพยายามถามว่าคุณจะทำให้ตัวแปรสภาพแวดล้อมยังคงอยู่ได้อย่างไร หากต้องการทำเช่นนั้นคุณจะต้องวางexport VAR="foo"คำสั่งของคุณลงในไฟล์ $ HOME / .bash_profile (หากคุณใช้ bash) หากคุณต้องการตัวแปรสภาพแวดล้อมนั้นยังคงมีอยู่สำหรับผู้ใช้ทั้งหมดยกเว้นรูทให้เพิ่มไปยัง / etc / profile หากคุณต้องการเพิ่มผู้ใช้รูทด้วยให้ตั้งใน /root/.bash_profile

สิ่งนี้จะใช้ได้กับเชลล์ล็อกอินทั้งหมดโดยที่ bash เป็นเชลล์ที่เลือก สำหรับเชลล์ที่ไม่ใช่ล็อกอินคุณต้องใช้. bashrc ฉันไม่มีความเข้าใจที่จะเสนอให้กับกระสุนอื่น ๆ : D


2
คุณอาจต้องการอ่านซ้ำอีกครั้งในส่วนของหน้า Bash man เกี่ยวกับเวลาที่ไฟล์เหล่านั้นมา
หยุดชั่วคราวจนกว่าจะมีการแจ้งให้ทราบต่อไป

1
ใช่ ... ฉันเข้าสู่ระบบและมีการโต้ตอบสับสน แก้ไขคำตอบของฉันเพื่อสะท้อน ขอบคุณสำหรับการแก้ไข!
whaley

"ทำให้ตัวแปรด้านสิ่งแวดล้อมยังคงมีอยู่" - อะไรคือสิ่งที่ยังคงมีอยู่?
George2

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

1
นั่นหมายความว่าคุณไม่ได้ทำให้มันขัดขืน ลองทำตามที่วาลีย์บรรยาย
หยุดชั่วคราวจนกว่าจะมีการแจ้งให้ทราบต่อไป

1

การส่งออกเป็นวิธีที่ตรงไปตรงมาที่สุดที่จะทำดังนั้นทำไมไม่ปล่อยไว้ที่นั้น?

export VARIABLE=value    # for Bourne, bash, and similar shells
setenv VARIABLE value    # for csh and similar shells

2
Bourne shell ต้องการ VARIABLE = value; ส่งออกตัวแปร
mpez0

1
สิ่งนี้น่าจะใช้ได้เช่นกัน ...
Stack Overflow ก็ตาย

@BloodPhilia, สำหรับ bash, เพียงวิธีเดียวในการตั้งค่าตัวแปรสภาพแวดล้อม?
George2

1
@ George2 - เมื่อใช้ VARIABLE = value คุณกำลังสร้างตัวแปรโลคัลซึ่งหายไปหลังจากการเรียกใช้สคริปต์ปัจจุบัน เมื่อใช้การเอ็กซ์พอร์ตกระบวนการลูกจะสืบทอดค่าตัวแปรจากกระบวนการพาเรนต์ ตัวอย่างเช่นFOO=BAR; executethisprogram โปรแกรมจะไม่ทราบว่าค่าของตัวแปรexecutethisprogram FOOในทางกลับกันเมื่อใช้: FOO=BAR; export FOO; executethisprogram โปรแกรมที่จะรู้ค่าของตัวแปรexecutethisprogram FOO
Stack Overflow ตาย

1
executethisprogram ไม่ใช่ subprocess ของ "export FOO" มันเป็นกระบวนการย่อย (ลูก) ของสคริปต์ที่เรียกมันหรือเชลล์แบบโต้ตอบ (บรรทัดคำสั่ง) export FOOคือคำสั่งที่ทำเครื่องหมายตัวแปรFOOเพื่อให้สามารถเข้าถึงได้โดยกระบวนการลูกของ envrionment ที่คำสั่งถูกใช้ พาเรนต์นั้นอาจเป็นสคริปต์หรือเชลล์แบบโต้ตอบ
หยุดชั่วคราวจนกว่าจะมีการแจ้งให้ทราบต่อไป

1

คุณสามารถทำสิ่งนี้:

VAR=val application

ตัวอย่างเช่น:

LANG=C ls --help

เอาต์พุตเป็นภาษาอังกฤษ

LANG=pl_PL ls --help

ผลผลิตในภาษาโปแลนด์ (ถ้ามี)

ในอดีตคุณไม่สามารถส่งออก VAL = val คุณต้อง

VAL=val; export VAL

ฉันสับสนเกี่ยวกับ "แอปพลิเคชัน VAR = val" หมายถึงแอปพลิเคชันใด
George2

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

ls คือสภาพแวดล้อมของเด็กในอะไร ฉันสับสน.
George2

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