เมื่อคุณใช้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 หากไม่ใช่คุณยังคงสามารถผ่านเป็นอาร์กิวเมนต์ไปได้ แต่อาร์กิวเมนต์จะถูกแทนที่ด้วยเชลล์ปัจจุบันดังนั้นจึงต้องตั้งค่าก่อนใช้งาน:value
command
VAR=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
ไหม