ความแตกต่างระหว่าง env, setenv, export และเวลาที่จะใช้คืออะไร?


18

เมื่อเร็ว ๆ นี้ฉันสังเกตเห็นว่าเรามี 3 ตัวเลือกในการตั้งค่าตัวแปรสภาพแวดล้อม:

  1. export envVar1=1
  2. setenv envVar2=2
  3. env envVAr3=3

หากมีวิธีอื่นโปรดบอกเรา

เมื่อใดที่ฉันควรเลือกหนึ่งรายการมากกว่ารายการอื่น กรุณาแนะนำแนวทาง

ในเรื่องของความเข้ากันได้ของเชลล์ซึ่งครอบคลุมมากที่สุด (ครอบคลุมภาษาของเชลล์มากกว่า)

ฉันสังเกตเห็นคำตอบนี้แล้วแต่ฉันต้องการขยายคำถามด้วยenvและแนวทางการตั้งค่าการใช้งาน

คำตอบ:


15

export VARIABLE_NAME='some value'เป็นวิธีที่จะตั้งค่าตัวแปรสภาพแวดล้อมในเปลือก POSIX สอดคล้องใด ๆ ( sh, dash, bash, kshฯลฯ .; ยัง zsh) หากตัวแปรมีค่าอยู่แล้วคุณสามารถใช้export VARIABLE_NAMEเพื่อทำให้เป็นตัวแปรสภาพแวดล้อมโดยไม่ต้องเปลี่ยนค่า

Pre-POSIX Bourne shellไม่รองรับสิ่งนี้ซึ่งเป็นสาเหตุที่คุณจะเห็นสคริปต์ที่หลีกเลี่ยงexport VARIABLE_NAME='some value'และใช้งานVARIABLE_NAME='some value'; export VARIABLE_NAMEแทน แต่กระสุน Bourne pre-POSIX นั้นหายากมากในปัจจุบัน

setenv VARIABLE_NAME='some value'เป็นไวยากรณ์ csh เพื่อตั้งค่าตัวแปรสภาพแวดล้อม setenvไม่มีอยู่ใน sh และ csh ไม่ค่อยถูกใช้อย่างมากในสคริปต์และผ่านการทุบตีสำหรับการใช้แบบโต้ตอบในช่วง 20 ปีที่ผ่านมา (และ zsh นานยิ่งขึ้น) ดังนั้นคุณสามารถลืมมันได้เว้นแต่คุณจะพบมัน

envคำสั่งเป็นอย่างมากไม่ค่อยมีประโยชน์ยกเว้นในสาย shebang เมื่อเรียกใช้โดยไม่มีข้อโต้แย้งมันจะแสดงสภาพแวดล้อม แต่exportจะดีขึ้น (เรียงลำดับและมักจะยกมาให้แก้ความสัมพันธ์ขึ้นบรรทัดใหม่ในค่าจากบรรทัดใหม่ที่แยกค่า) เมื่อเรียกใช้ด้วยอาร์กิวเมนต์มันจะเรียกใช้คำสั่งที่มีตัวแปรสภาพแวดล้อมพิเศษ แต่คำสั่งเดียวกันโดยไม่มีการenvทำงาน ( VAR=value mycommandทำงานmycommandด้วยการVARตั้งค่าเป็นvalueเหมือนenv VAR=value mycommand) เหตุผลenvมีประโยชน์ในบรรทัด shebang คือมันทำการPATHค้นหาและมันจะไม่ทำสิ่งใดเมื่อเรียกด้วยชื่อคำสั่ง envคำสั่งสามารถเป็นประโยชน์เพื่อเรียกใช้คำสั่งที่มีตัวแปรสภาพแวดล้อมเพียงไม่กี่กับ-iหรือไม่มีพารามิเตอร์เพื่อแสดงสภาพแวดล้อมรวมถึงตัวแปรที่มีชื่อไม่ถูกต้องที่เชลล์ไม่ได้นำเข้า


3

การตั้งค่าตัวแปรเช่นVAR='asdf'ปล่อยให้สภาพแวดล้อมไม่เปลี่ยนแปลงซึ่งหมายความว่าโปรแกรมที่คุณเปิดใช้ในเซสชันเดียวกันจะไม่รู้อะไรเลยVARและจะไม่สามารถเข้าถึงได้ คุณต้องการพฤติกรรมนี้เมื่อเขียนเชลล์สคริปต์

exportในอีกทางหนึ่งคือ bash builtin ที่ปรับเปลี่ยนสภาพแวดล้อมจึงทำให้ตัวแปรที่ส่งออกสามารถมองเห็นได้สำหรับกระบวนการลูกที่เกิดในช่วงปัจจุบัน VAR='asdf' %program_name%คุณสามารถบรรลุเดียวกันโดยการทำงาน

envไม่ใช่ builtin แต่เป็นโปรแกรมด้วยตัวเอง บนพื้นผิวมันทำงานได้เหมือนเมื่อคุณVAR='asdf' %program_name%แต่ในระดับต่ำกว่าจะมีความซับซ้อนเพิ่มขึ้นเล็กน้อย ครั้งแรกที่envได้รับการเปิดตัว มันแก้ไขสภาพแวดล้อมจากนั้นดำเนินการคำสั่งที่มีข้อโต้แย้งที่กำหนด พฤติกรรมเดียวกันที่คุณสามารถทำได้ในรหัสของคุณเองโดยใช้การเรียกระบบexec (3)

setenvอยู่exportใน csh-family shells ดังที่ระบุไว้ในคำตอบของคุณ


2
ในเชลล์ที่ทันสมัยVAR=asdfจะอัพเดตสภาพแวดล้อมหากVARอยู่ในสภาพแวดล้อมแล้ว (สิ่งนี้ไม่เป็นความจริงในเชลล์ Bourne ดั้งเดิม)
Gilles 'SO- หยุดความชั่วร้าย'

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