ลำดับความสำคัญของ && vs & ใน bash และ zsh


9

ตอบคำถามนี้ฉันค้นพบความแตกต่างที่ตลกมาก (และบอบบาง) ระหว่างพฤติกรรมในbashและzsh:

ในbash:

romano@RRyS:~$ pwd
/home/romano
romano@RRyS:~$ alias x="cd /bin && ./echo A >/dev/null  &"
romano@RRyS:~$ x
[1] 16611
romano@RRyS:~$ pwd
/home/romano

อย่างที่คุณเห็นการดำเนินการของนามแฝงxจะดำเนินการใน subshell ดังนั้นไดเรกทอรีปัจจุบันจะไม่เปลี่ยนแปลง

ไม่อยู่ในzsh:

[romano:~] % pwd
/home/romano
[romano:~] % alias x="cd /bin && ./echo A >/dev/null &"
[romano:~] % x
[1] 16744
[1]  + 16744 done       ./echo A >/dev/null                                    
1& [romano:/bin] % pwd
/bin
[romano:/bin] % 

ที่นี่ไดเรกทอรีมีการเปลี่ยนแปลง

ดูเหมือนว่า&ในbashมีความสำคัญแตกต่างกว่าในzsh--- ฉันหมายถึงคำสั่งที่ดูเหมือนว่าจะอ่านเป็น

(cd /tmp && echo A) & 

ในbashและเป็น

cd /tmp && (echo A &) 

ในzsh. สิ่งนี้ถูกต้องหรือสาเหตุของพฤติกรรมที่แตกต่างเป็นสาเหตุอื่นหรือไม่

คำตอบ:


9

พฤติกรรมที่เป็นเอกสารต่างกันใน zshmisc

รายชื่อเป็นลำดับของศูนย์หรือมากกว่ารายการย่อยซึ่งในแต่ละรายการย่อยจะถูกยกเลิกโดย;, &, &|, &!หรือขึ้นบรรทัดใหม่ เทอร์มินี้อาจเลือกที่จะละเว้นจากรายการย่อยสุดท้ายในรายการเมื่อรายการปรากฏเป็นคำสั่งภายในที่ซับซ้อนหรือ(...) {...}เมื่อรายการย่อยถูกยกเลิกโดย;หรือขึ้นบรรทัดใหม่เชลล์จะรอให้รายการนั้นเสร็จสิ้นก่อนที่จะดำเนินการรายการย่อยถัดไป หากมีรายการย่อยจะถูกยกเลิกโดย&, &|หรือ&!เปลือกดำเนินการที่ผ่านมาในท่อในพื้นหลังและไม่รอให้เสร็จสิ้น (โปรดสังเกตความแตกต่างจากหอยอื่น ๆ ซึ่งดำเนินรายการย่อยทั้งในพื้นหลัง) ไพพ์ไลน์ที่มีพื้นหลังส่งคืนสถานะเป็นศูนย์


3

ฝังในzshmisc(1)เป็นบรรทัดต่อไปนี้:

หากรายการย่อยถูกยกเลิกโดย&',& | 'หรือ `&!' เชลล์จะเรียกใช้ขั้นตอนสุดท้ายในพื้นหลัง

แม้ว่าจะไม่ได้ระบุไว้โดยเฉพาะว่าท่ออื่น ๆ ในรายการย่อยจะถูกดำเนินการในเชลล์ปัจจุบันซึ่งดูเหมือนจะเป็นสิ่งที่มันหมายถึงและพฤติกรรมที่คุณสังเกตเห็นสนับสนุนการตีความนั้น ตัวอย่างเช่น:

$ echo $foo $bar

$ foo=3 && bar=5 && sleep 1 &
$ echo $foo $bar
3 5

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

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