ขอให้เราพิจารณาตัวอย่างที่เฉพาะเจาะจง 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
เห็นได้ชัดว่าตัวเลือกที่ไม่ได้รับการส่งผ่านไปยัง-v
grep
คุณต้องการที่จะใช้รูปแบบนี้เมื่อคุณมีการตั้งค่าตัวแปรเพียงเปลือกที่จะใช้เช่นในคุณไม่ต้องการที่จะส่งออก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/interpreter
env
execvp()
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
)