เมื่อคุณใช้LANG=C gcc ... สิ่งที่เกิดขึ้นคือเชลล์ตั้งค่า LANG สำหรับgccสภาพแวดล้อมของเท่านั้นและไม่ใช่สำหรับสภาพแวดล้อมปัจจุบัน ( ดูหมายเหตุ ) ดังนั้นหลังจากgccเสร็จสิ้นLANGจะกลับไปเป็นค่าก่อนหน้า (หรือยกเลิกการตั้งค่า)
นอกจากนี้เมื่อคุณใช้A=10 echo $Aเป็นเชลล์ที่แทนที่ $ A ไม่ใช่เสียงสะท้อนและการทดแทนนี้ (เรียกว่า "การขยาย") เกิดขึ้นก่อนที่คำสั่งจะถูกประเมิน (รวมถึงการมอบหมาย) ดังนั้นการทำงานตามที่คาดหวังAจะต้องตั้งค่าไว้แล้ว ในสภาพแวดล้อมปัจจุบันก่อนคำสั่งนั้น
นั่นเป็นสาเหตุที่A=10 echo $Aไม่ทำงานตามที่คาดไว้: A=10จะถูกตั้งค่าสำหรับ echo แต่ echo จะไม่สนใจค่าของตัวแปรสภาพแวดล้อมAภายใน และ$Aถูกแทนที่ด้วยค่าที่ตั้งไว้ในเปลือกปัจจุบัน (ซึ่งก็คือไม่มี) แล้วส่งผ่านเป็นอาร์กิวเมนต์เพื่อสะท้อน
ดังนั้นสมมติฐานของคุณถูกต้อง: VAR=value command ใช้งานได้ แต่จะมีความเกี่ยวข้องเฉพาะถ้าใช้commandภายในVAR หากไม่ใช่คุณยังคงสามารถผ่านเป็นอาร์กิวเมนต์ไปได้ แต่อาร์กิวเมนต์จะถูกแทนที่ด้วยเชลล์ปัจจุบันดังนั้นจึงต้องตั้งค่าก่อนใช้งาน:valuecommandVAR=value; command "$VAR"
หากคุณรู้วิธีสร้างสคริปต์ที่เรียกใช้งานได้คุณสามารถลองใช้วิธีทดสอบนี้ได้:
#!/bin/sh
echo "1st argument is $1"
echo "A is $A"
บันทึกเป็นtestscriptและลอง:
$ A=5; A=10 testscript "$A"; echo "$A"
1st argument is 5
A is 10
5
สุดท้าย แต่ไม่น้อยก็คุ้มค่าการทราบความแตกต่างระหว่างเปลือกและสภาพแวดล้อมของตัวแปรและโปรแกรมการขัดแย้ง
นี่คือบางส่วนอ้างอิงที่ดี:
.
(*) หมายเหตุ: ในทางเทคนิคเปลือกไม่ตั้งอยู่ในสภาพแวดล้อมปัจจุบันเกินไปและนี่คือเหตุผล: คำสั่งบางอย่างเช่นecho, readและtestมีbuiltins เปลือกและเป็นเช่นพวกเขาไม่ได้วางไข่กระบวนการเด็ก พวกเขาทำงานในสภาพแวดล้อมปัจจุบัน แต่เชลล์จะดูแลการมอบหมายเท่านั้นคงอยู่จนกว่าคำสั่งจะทำงานดังนั้นสำหรับวัตถุประสงค์ในทางปฏิบัติทั้งหมดผลจะเหมือนกัน: การมอบหมายจะเห็นได้จากคำสั่งเดียว
A=10 (echo $A)และรับได้10ไหม