ความแตกต่างระหว่างตัวแปรเชลล์ที่ถูกเอ็กซ์พอร์ตและที่ไม่ได้อยู่ใน bash


41

Bash ดูเหมือนจะแยกความแตกต่างระหว่างตัวแปรที่ถูกส่งออกและที่ไม่ได้

ตัวอย่าง:

$ FOO=BAR
$ env | grep FOO
$ set | grep FOO
FOO=BAR

setเห็นตัวแปร แต่envทำไม่ได้

$ export BAR=FOO
$ env | grep FOO
BAR=FOO
$ set | grep FOO
BAR=FOO
FOO=BAR

setเห็นทั้งสองตัวแปร แต่envเห็นเฉพาะตัวแปรที่ส่งออก

ฉันรู้ว่านั่นsetคือทุบตี builtin และenvไม่

อะไรคือความแตกต่างระหว่างตัวแปรที่ถูกเอ็กซ์พอร์ตและตัวแปรที่ไม่ใช่?


17
หมายเหตุคำศัพท์:“ ตัวแปรสภาพแวดล้อม” จะถูกส่งออกเสมอ ตัวแปรที่ไม่ถูกเอ็กซ์พอร์ตคือ“ ตัวแปรเชลล์” (หรือ“ พารามิเตอร์”)
Gilles 'ดังนั้นหยุดความชั่วร้าย'

คำตอบ:


44

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

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

setแสดงผลสภาพแวดล้อมปัจจุบันซึ่งรวมถึงตัวแปรที่ไม่ส่งออกในท้องถิ่นใด ๆ envใช้เพื่อเรียกใช้โปรแกรมในสภาพแวดล้อมใหม่และไม่มีข้อโต้แย้งใด ๆ ที่จะแสดงผลว่าสภาพแวดล้อมใหม่จะเป็นเช่นไร เนื่องจากenvกำลังสร้างสภาพแวดล้อมใหม่จะมีเพียงตัวแปรที่ส่งออกเท่านั้นที่ผ่านมาเช่นเดียวกับกรณีของโปรแกรมใด ๆ ที่เปิดตัวจากเชลล์นั้น ตัวอย่างเช่นวางไข่เปลือกที่สองภายในแรก (ฉันใช้$$เพื่อเป็นตัวแทนของแจ้งในเปลือกด้านใน):

$ FOO=BAR
$ bash
$$ echo $FOO             # Note the empty line

$$ exit
$ export FOO
$ bash
$$ echo $FOO
BAR
$$

โปรดทราบว่ามันเป็นตัวแปรที่ส่งออกไม่ใช่แค่ค่าของมัน ซึ่งหมายความว่าเมื่อคุณexport FOO, FOOกลายเป็นตัวแปรทั่วโลกและการแสดงขึ้นมาในสภาพแวดล้อมที่ตามมาแม้ว่าการเปลี่ยนแปลงในภายหลัง

$ export FOO
$ FOO=BAR
$ bash
$$ echo $FOO
BAR
$$

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