สมมติว่าผมเรียกA=B command
และในenv A=B command
bash
มีสถานการณ์ใดบ้างที่อาจมีความแตกต่างระหว่างการขอร้องทั้งคู่?
สมมติว่าผมเรียกA=B command
และในenv A=B command
bash
มีสถานการณ์ใดบ้างที่อาจมีความแตกต่างระหว่างการขอร้องทั้งคู่?
คำตอบ:
พวกเขาให้บริการวัตถุประสงค์เดียวกัน (ผ่าน vars env ที่กำหนดให้กับคำสั่ง) อย่างไรก็ตามความแตกต่างที่น่าสังเกต:
A=B command
เป็นโครงสร้างของเชลล์ (Bourne / POSIX / rc)
ตัวอย่างเช่นคุณสามารถทำได้:
A=B find . -exec cmd '{}' +
หรือ:
find . -exec env A=B cmd '{}' +
แต่คุณไม่สามารถทำได้:
find . -exec A=B cmd '{}' +
เนื่องจากfind
ไม่ได้เรียกใช้เชลล์เพื่อเรียกใช้คำสั่งนั้น
ในขณะenv
ที่เป็นคำสั่งภายนอกคุณไม่สามารถทำ:
f() { ...; }
env A=B f
หรือ:
env A=B eval '...'
นอกจากนี้:
A=B cmd
ใช้ได้กับ env vars ที่เป็นชื่อตัวแปรเชลล์ที่ถูกต้องเท่านั้น คุณต้องการenv
ชื่อ env var อื่น ๆ :
env 'my var=foo' cmd...
bash
รีเซ็ต_
ตัวแปร:
bash-4.3$ _=xxx env | grep '^_='
_=/usr/bin/env
bash-4.3$ env _=xxx env | grep '^_='
_=xxx
ในzsh
, ARGV0
และSTTY
มีความหมายพิเศษในบริบทที่:
STTY=-echo cat
ทำงานcat
โดยecho
ปิดการทำงานของเทอร์มินัล และ:
ARGV0=foo cmd
ทำงานcmd
ด้วยเป็นของตนfoo
argv[0]
env
หากคุณไม่ต้องการที่ประมวลผลพิเศษที่คุณต้องใช้
โปรดทราบว่าsudo
รองรับ:
sudo A=B cmd
มันไม่ได้ใช้เปลือกหรือenv
ทำสิ่งนั้น มันทำด้วยตัวเอง
มันสามารถผ่านตัวแปรที่มีชื่อเริ่มต้นใด ๆ -
ยกเว้นผู้ที่มี
การมอบหมายเป็นโครงสร้างของเชลล์ในขณะที่เครื่องหมายเท่ากับในอาร์กิวเมนต์ของenv
ไม่มีความหมายพิเศษกับเชลล์ดังนั้นA=$B cmd
จะปลอดภัยในขณะที่env A="$B" cmd
(หรือsudo A="$B" cmd
) ต้องมีเครื่องหมายคำพูดคู่
สนับสนุนA=B cmd
ไวยากรณ์ในเชลล์ของ Bourne และrc
ตระกูลเท่านั้น (ไม่ใช่es
) เช่นในเปลือกหอยcsh
หรือfish
ครอบครัวคุณต้องหันไปenv
ใช้