ตัวแปรเชลล์กับตัวแปรสภาพแวดล้อมใดที่ต้องการถ้าทั้งคู่มีชื่อเหมือนกัน?


10

พิมพ์ข้อความต่อไปนี้ใน Bash:

env | grep USER

และ

set | grep USER

ให้ชื่อผู้ใช้เดียวกันทั้งสองครั้ง

ฉันจะรู้ได้อย่างไรเช่นเมื่อพิมพ์echo $USERถ้าเชลล์หรือตัวแปรสภาพแวดล้อมถูกแสดง?

คำตอบ:


14

สำหรับกระสุนที่เข้ากันได้กับ POSIX (รวมถึง Bash) มาตรฐานบอกว่า:

2.5.3 ตัวแปรของเชลล์ตัวแปร
จะต้องเริ่มต้นจากสภาพแวดล้อม[... ] หากตัวแปรเริ่มต้นจากสภาพแวดล้อมตัวแปรนั้นจะถูกทำเครื่องหมายเพื่อส่งออกทันที ดูการส่งออกในตัวพิเศษ ตัวแปรใหม่สามารถกำหนดและเริ่มต้นได้ด้วยการกำหนดตัวแปร[ฯลฯ ]

และเกี่ยวกับexport:

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

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

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


หากคุณใช้เชลล์ที่ไม่ใช่ POSIX เช่นcshสิ่งต่าง ๆ อาจแตกต่างกัน:

$ csh
% echo $foo
foo: Undefined variable.
% setenv foo bar
% echo $foo
bar
% set foo=asdf
% echo $foo
asdf
% env |grep foo
foo=bar
% exit

1
โปรดทราบว่าเชลล์เป้าหมายเช่น csh เริ่มต้นตัวแปรเชลล์จากตัวแปรสภาพแวดล้อม แต่การแก้ไขตัวแปรเชลล์ไม่ส่งผลกระทบต่อตัวแปรสภาพแวดล้อมที่สอดคล้องเว้นแต่ว่าคุณจะส่งออก นั่นเป็นสิ่งที่ถูกทำลายโดย Korn เชลล์ (และระบุโดย POSIX) นั่นเป็นเหตุผลที่คุณควรระวังชื่อของตัวแปรเชลล์ที่คุณใช้ตอนนี้เพื่อให้แน่ใจว่าคุณไม่ได้แก้ไข env vars ที่อาจส่งผลต่อคำสั่งที่คุณใช้ในสคริปต์ของคุณ
Stéphane Chazelas

4

เหล่านี้เป็นหนึ่งและตัวแปรเดียวกัน ในเชลล์เมื่อเทียบกับภาษาการเขียนโปรแกรมส่วนใหญ่อื่น ๆ ตัวแปรสภาพแวดล้อมและตัวแปรเชลล์ใช้พื้นที่ชื่อเดียวกัน exportในเปลือกตัวแปรสภาพแวดล้อมเป็นตัวแปรเชลล์ที่มีการส่งออกด้วย

ดูตัวอย่างเช่นคำตอบของคำถามก่อนหน้าของฉัน " ความแตกต่างในการใช้งานระหว่างตัวแปรเชลล์และตัวแปรสภาพแวดล้อมคืออะไร "


ฉันจะอ่านคำอธิบายของคุณอีกครั้งฉันต้องเรียนรู้บางสิ่งก่อนก่อนที่จะเข้าใจคำตอบของคุณ
sharkant

@sharkant ไม่ต้องกังวลเลย หากฉันสับสนสิ่งต่าง ๆ เพียงแค่บอกฉันและฉันจะพยายามชี้แจง คำตอบของ ilkkachu ก็ดีเหมือนกัน
Kusalananda

ไม่ฉันไม่คิดอย่างนั้นคุณมีรูปแบบการอธิบายที่ดีมันเป็นเพียงการขาดความรู้ของฉันซึ่งยังไม่สามารถหวงแหนพวกเขาได้
sharkant

2

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

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