ตัวแปรสภาพแวดล้อมเทียบกับตัวแปรเชลล์ความแตกต่างคืออะไร


56

มีคนบอกฉันว่า:

BASH ไม่ใช่ตัวแปรสภาพแวดล้อม แต่เป็นตัวแปรเชลล์

ความแตกต่างคืออะไร?


เสียงเหมือนสิ่งเดียวกันมีขอบเขตที่แตกต่างกันอย่างไร
Alexander Mills

คำตอบ:


35

$BASHเป็นตัวแปรโลคัลที่ใช้ได้ในเชลล์ปัจจุบัน (bash) เท่านั้น

ตัวแปรสภาพแวดล้อมเช่น$SHELLนั้นใช้ได้ทั้งระบบ ในเชลล์ Bash ปัจจุบัน$BASHชี้ไปที่พา ธ การประมวลผลของbashในขณะที่$SHELLชี้ไปที่เชลล์ที่กำหนดเป็นค่าเริ่มต้น (ซึ่งอาจเป็นค่าเดียวกัน)

สำหรับคำอธิบายของตัวแปรสภาพแวดล้อมดูตัวแปรสภาพแวดล้อมในวิธีใช้ของ Ubuntu


1
ลิงค์ที่ยอดเยี่ยม (+1) :)
Peter.O

12
คำตอบนี้ไม่ถูกต้อง / ไม่ถูกต้อง ตัวแปรสภาพแวดล้อมไม่ได้อยู่ทั่วโลก / ทั้งระบบ ตัวแปรเชลล์เป็นแบบส่วนตัวกับเชลล์ที่รันอยู่ในปัจจุบันและจะไม่ถูกเอ็กซ์พอร์ต (ส่งผ่าน) ไปยังกระบวนการลูกใด ๆ ตัวแปรสภาพแวดล้อมจะถูกส่งออกไปยังกระบวนการลูกใด ๆ "MYVAR = private; export OURVAR = shared; printenv" จะรายงานเฉพาะ "OURVAR" เพราะเมื่อเชลล์ประมวลผลคำสั่ง printenv จะส่งออก OURVAR แต่ไม่ใช่ MYVAR
CM

2
ความคิดเห็น +1 ถึง CM! ฉันไม่เคยได้ยินความแตกต่างอธิบายอย่างนั้นและถูกต้อง !!! ความคิดเห็นนี้ควรเป็นคำตอบ
Jesse the Wind Wanderer

48

ตัวแปรสภาพแวดล้อมเป็นสากลที่พร้อมใช้งานในโปรแกรมและโปรแกรมย่อย ตัวแปรเชลล์มีอยู่ในเชลล์ปัจจุบันเท่านั้น หากต้องการทำให้ตัวแปรเชลล์พร้อมใช้งานเป็นตัวแปรสภาพแวดล้อมให้ใช้export VARNAME(โดยไม่ใช้เงินดอลลาร์$)

ตัวอย่างสำหรับการชี้แจง:

$ SOME=VAR # define shell variable $SOME
$ echo $SOME
VAR
$ env | grep SOME # note: no output
$ export SOME # turn $SOME into an environment variable
$ env | grep SOME
SOME=VAR

อีกวิธีหนึ่งในการกำหนดตัวแปรสภาพแวดล้อม:

$ export ANOTHER=VALUE
$ echo $ANOTHER
VALUE
$ env | grep ANOTHER
ANOTHER=VALUE

ฉันไม่คิดว่ามันถูกต้อง exportไม่จำเป็นต้องตั้งค่าตัวแปรสภาพแวดล้อม stackoverflow.com/questions/7411455/…
Chris Stryczynski

3
@ChrisStryczynski ได้exportตั้งค่าตัวแปรสภาพแวดล้อมสำหรับกระบวนการลูก โพสต์ที่คุณเชื่อมโยงไม่ขัดแย้งกับคำตอบนี้คุณช่วยอธิบายได้ไหมว่าทำไมคุณคิดว่ามันผิด
Lekensteyn

exportตั้งค่าตัวแปรสภาพแวดล้อมอย่างแน่นอน
David Tonhofer

8

มีความแตกต่าง ตัวแปรของเชลล์และตัวแปรสภาพแวดล้อมจะอธิบายได้ดีกว่าที่ฉันทำได้ แต่นี่เป็นข้อความที่ตัดตอนมาจากมัน:

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


ผมแสดงความคิดเห็นคำตอบของตัวเอง .. ผมชอบช่วยเหลืออูบุนตูเชื่อมโยงในคำตอบของ Takkat ... (มันดีกว่าฉัน)
Peter.O

3
รวมลิงค์ของคุณไม่ทำงาน!

1

ตัวแปรเชลล์: ระยะสั้น, ใช้เฉพาะกับอินสแตนซ์ปัจจุบันของเชลล์, ไม่ครอบคลุมระบบ

ตัวแปรสภาพแวดล้อม: การใช้งานระยะยาว, ใช้ได้ทั้งระบบ, อนุญาตจากทั่วโลก

โดยการประชุม Shell Variable มีชื่อเป็นตัวพิมพ์เล็กในขณะที่ Envn ตัวแปรถูกเขียนเป็นตัวพิมพ์ใหญ่


-1

หากต้องการตอบคำถามนี้ก่อนอื่นให้พยายามทำความเข้าใจขอบเขตของตัวแปร

เมื่อคุณสร้างตัวแปรใหม่แบบที่SOME_ENV_VARIABLE="testing.txt"มันอยู่ในSHELL scopeนั้นหมายความว่ามันสามารถเข้าถึงได้โดยอินสแตนซ์ของเชลล์ที่ผู้ใช้เข้าสู่ระบบเมื่อมีการเปลี่ยนแปลงอินสแตนซ์เช่นคุณเปิดเทอร์มินัลใหม่หรือคุณเปลี่ยนเชลล์ (เช่นคุณ เปลี่ยนเป็นcsh) คุณไม่สามารถเข้าถึงตัวแปรนั้นได้

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

[vishrant@localhost]$ SOME_ENV_VARIABLE="testing.txt" #creating variable in bash shell
[vishrant@localhost]$ echo $SOME_ENV_VARIABLE
testing.txt
[vishrant@localhost]$ export SOME_ENV_VARIABLE #variable now available with environment
[vishrant@localhost]$ env | grep SOME_ENV_VARIABLE
SOME_ENV_VARIABLE=testing.txt
[vishrant@localhost]$ csh #changing shell
[vishrant@localhost ~/shell_scripting]$ echo $SOME_ENV_VARIABLE
testing.txt
[vishrant@localhost ~/shell_scripting]$ exit
exit #returned to parent shell
[vishrant@localhost]$ SOME_SHELL_VARIABLE="hello.txt"
[vishrant@localhost]$ csh
[vishrant@localhost ~/shell_scripting]$ echo $SOME_SHELL_VARIABLE
SOME_SHELL_VARIABLE: Undefined variable.

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

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

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