เมื่อใดจึงควรใช้เซมิโคลอนระหว่างตัวแปรสภาวะแวดล้อมและคำสั่ง


14

ทุกคนสามารถอธิบายได้หรือไม่ว่าทำไมเซมิโคลอนจึงมีความจำเป็นเพื่อที่LANGจะเห็นการอัปเดตโดยการทุบตี?

ใช้งานไม่ได้:

> LANG=Ja_JP bash -c "echo $LANG"
en_US

ผลงาน:

> LANG=Ja_JP ; bash -c "echo $LANG"
Ja_JP

ฉันทำงานกับทั้งทุบตี 4.1.10 ใน linux และรุ่นเดียวกันภายใต้ cygwin

คำตอบ:


23

พารามิเตอร์และการขยายประเภทอื่น ๆ จะดำเนินการเมื่อคำสั่งถูกอ่านก่อนที่จะถูกดำเนินการ

รุ่นแรกLANG=Ja_JP bash -c "echo $LANG", เป็นคำสั่งเดียว หลังจากถูกวิเคราะห์คำเช่น$LANGนี้ให้ขยายเป็นen_USก่อนที่จะมีการดำเนินการใด ๆ เมื่อbashเสร็จสิ้นการประมวลผลอินพุตส้อมกระบวนการเพิ่มต่อสิ่งแวดล้อมตามที่คาดไว้แล้วรันLANG=Ja_JPbash -c echo en_US

คุณสามารถป้องกันการขยายตัวที่มีราคาเดียวคือเอาท์พุทLANG=Ja_JP bash -c 'echo $LANG'Ja_JP

โปรดทราบว่าเมื่อคุณมีการกำหนดตัวแปรเป็นส่วนหนึ่งของคำสั่งการมอบหมายจะมีผลกับสภาพแวดล้อมของคำสั่งนั้นเท่านั้นและไม่ใช่ของเชลล์

รุ่นที่สองLANG=Ja_JP; bash -c "echo $LANG"เป็นจริงสองคำสั่งแยกดำเนินการตามลำดับ สิ่งแรกคือการกำหนดตัวแปรแบบง่ายโดยไม่มีคำสั่งดังนั้นมันจะมีผลกับเชลล์ปัจจุบันของคุณ

ดังนั้นทั้งสองตัวอย่างของคุณมีพื้นฐานที่แตกต่างแม้จะมีความแตกต่างตื้น ๆ ;ของซิงเกิ้ล

ปิดหัวข้อทั้งหมด แต่ฉันขอแนะนำให้ผนวกการ.UTF-8ตั้งค่าเมื่อLANGใด ปัจจุบันไม่มีเหตุผลที่ดีที่จะไม่ใช้ Unicode ในศตวรรษที่ 21


คำตอบที่ดี - ขอบคุณ! เกี่ยวกับการเพิ่ม UTF-8 ฉันกำลังพยายามทดสอบการจัดการโลแคลของแอปพลิเคชันที่ต้องทำงานบนแพลตฟอร์มหลายแห่งซึ่งค่อนข้างเก่า ระหว่างความแตกต่างเช่นอันนี้ (ซึ่งโชคดีที่คุณอธิบาย) และความแตกต่างใน linux และ cygwin ฉันกำลังจะขว้างตัวเองบนรถบัส!
Richard Corden

5

VAR=value; somecommand เทียบเท่ากับ

VAR=value
somecommand

เหล่านี้เป็นคำสั่งที่ไม่เกี่ยวข้องดำเนินการอย่างใดอย่างหนึ่งหลังจากที่อื่น VARคำสั่งแรกกำหนดค่าให้กับตัวแปรเปลือก หากVARไม่มีตัวแปรสภาพแวดล้อมอยู่แล้วจะไม่ถูกส่งออกไปยังสภาพแวดล้อม แต่จะยังคงอยู่ภายในเชลล์ คำสั่งexport VARจะส่งออกVARไปยังสภาพแวดล้อม

VAR=value somecommandเป็นไวยากรณ์ที่แตกต่าง การกำหนดVAR=valueให้กับสภาพแวดล้อม แต่การมอบหมายนี้ทำในสภาพแวดล้อมการดำเนินการของsomecommandเท่านั้นไม่ใช่สำหรับการเรียกใช้งานเชลล์ในภายหลัง

ตามตัวอย่าง:

# Assume neither VAR1 nor VAR2 is in the environment
VAR1=value
echo $VAR1                        # displays "value"
env | grep '^VAR1='               # displays nothing
VAR2=value env | grep '^VAR2='    # displays "VAR2=value"
echo $VAR2                        # displays nothing

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