ขอให้เราพิจารณาตัวอย่างที่เฉพาะเจาะจง grepคำสั่งใช้ตัวแปรสภาพแวดล้อมที่เรียกว่าGREP_OPTIONSการตั้งค่าตัวเลือกเริ่มต้น
ตอนนี้ ระบุว่าไฟล์test.txtมีบรรทัดต่อไปนี้:
line one
line two
การรันคำสั่งgrep one test.txtจะส่งคืน
line one
หากคุณรัน grep ด้วย-vตัวเลือกมันจะส่งคืนบรรทัดที่ไม่ตรงกันดังนั้นเอาต์พุตจะเป็น
line two
ตอนนี้เราจะพยายามตั้งค่าตัวเลือกด้วยตัวแปรสภาพแวดล้อม
ตัวแปรสภาวะแวดล้อมที่ตั้งค่าโดยไม่มีexportจะไม่ถูกสืบทอดในสภาวะแวดล้อมของคำสั่งที่คุณกำลังเรียก
GREP_OPTIONS='-v'
grep one test.txt
ผลลัพธ์:
line one
เห็นได้ชัดว่าตัวเลือกที่ไม่ได้รับการส่งผ่านไปยัง-vgrep
คุณต้องการที่จะใช้รูปแบบนี้เมื่อคุณมีการตั้งค่าตัวแปรเพียงเปลือกที่จะใช้เช่นในคุณไม่ต้องการที่จะส่งออกfor i in * ; do$i
อย่างไรก็ตามตัวแปรจะถูกส่งต่อไปยังสภาพแวดล้อมของบรรทัดคำสั่งนั้นโดยเฉพาะดังนั้นคุณสามารถทำได้
GREP_OPTIONS='-v' grep one test.txt
ซึ่งจะคืนค่าที่คาดไว้
line two
คุณใช้แบบฟอร์มนี้เพื่อเปลี่ยนแปลงสภาพแวดล้อมของอินสแตนซ์เฉพาะของโปรแกรมที่เปิดใช้ชั่วคราว
การส่งออกตัวแปรทำให้ตัวแปรนั้นได้รับการถ่ายทอด:
export GREP_OPTIONS='-v'
grep one test.txt
ส่งคืนตอนนี้
line two
นี่เป็นวิธีที่พบได้บ่อยที่สุดของการตั้งค่าตัวแปรสำหรับการใช้กระบวนการที่เริ่มในภายหลังในเชลล์
ทั้งหมดนี้ทำในการทุบตี exportเป็นทุบตี builtin; VAR=whateverเป็นไวยากรณ์ทุบตี envในอีกด้านหนึ่งเป็นโปรแกรมในตัวเอง เมื่อenvถูกเรียกสิ่งต่อไปนี้จะเกิดขึ้น:
- คำสั่ง
envถูกเรียกใช้งานเป็นกระบวนการใหม่
env ปรับเปลี่ยนสภาพแวดล้อมและ
- เรียกคำสั่งที่ให้ไว้เป็นอาร์กิวเมนต์
envกระบวนการจะถูกแทนที่ด้วยcommandกระบวนการ
ตัวอย่าง:
env GREP_OPTIONS='-v' grep one test.txt
คำสั่งนี้จะเปิดตัวกระบวนการใหม่สองกระบวนการ: (i) env และ (ii) grep (อันที่จริงแล้วกระบวนการที่สองจะแทนที่กระบวนการแรก) จากมุมมองของgrepกระบวนการผลลัพธ์จะเหมือนกับการรัน
GREP_OPTIONS='-v' grep one test.txt
อย่างไรก็ตามคุณสามารถใช้สำนวนนี้หากคุณอยู่นอกทุบตีหรือไม่ต้องการที่จะเปิดเปลือกอื่น (ตัวอย่างเช่นเมื่อคุณใช้exec()ตระกูลของฟังก์ชั่นมากกว่าการsystem()โทร)
หมายเหตุเพิ่มเติมเกี่ยวกับ #!/usr/bin/env
และนี่ก็เป็นเหตุผลว่าทำไมสำนวนถูกนำมาใช้มากกว่า#!/usr/bin/env interpreter ไม่ต้องการพา ธ เต็มไปยังโปรแกรมเพราะมันใช้ฟังก์ชั่นที่ค้นหาตัวแปรเช่นเดียวกับที่เชลล์ทำและแทนที่ ตัวเองด้วยการรันคำสั่ง ดังนั้นจึงสามารถใช้เพื่อค้นหาตำแหน่งที่ล่าม (เช่น perl หรือ python) ที่ "อยู่" บนเส้นทาง#!/usr/bin/interpreterenvexecvp()PATH
นอกจากนี้ยังหมายความว่าโดยการปรับเปลี่ยนเส้นทางปัจจุบันคุณสามารถมีผลต่อตัวแปรหลามที่จะเรียกว่า สิ่งนี้ทำให้เป็นไปได้:
echo -e '#!/usr/bin/bash\n\necho I am an evil interpreter!' > python
chmod a+x ./python
export PATH=.
calibre
แทนที่จะเปิดตัว Caliber จะส่งผลให้
I am an evil interpreter!
export key=valueมีการขยายไวยากรณ์และไม่ควรใช้ในสคริปต์แบบพกพา (เช่น#! /bin/sh)