วิธีเขียน for for loop ที่รันคำสั่งแบบอะซิงโครนัสในแต่ละการวนซ้ำ


23

ฉันสงสัยว่าทำไมมีข้อผิดพลาดในการใช้คำสั่งแบบอะซิงโครนัสภายในลูป?

$ for i in {1..8}; do sleep 100 & ; done
bash: syntax error near unexpected token `;'

ถ้าฉันเขียนมันเป็น

$ for i in {1..8}; do 
> sleep 100 & 
> done

มันใช้งานได้ดี

ฉันจะเขียนมันในหนึ่งบรรทัดโดยไม่มีข้อผิดพลาดได้อย่างไร?

คำตอบ:


39

วาง;:

for i in {1..8}; do sleep 100 & done

&แยกคำสั่งเพื่อให้;เป็น extraneous (และเชลล์คาดหวังอะไรบางอย่างระหว่าง&และ;)


ขอบคุณ "เชลล์คาดหวังบางสิ่งระหว่าง & และ;" ดังนั้นทำไมคำสั่งว่างจึงไม่ตกลงระหว่าง & และ;
ทิม

5
คำสั่ง no-op ที่แท้จริงคือ:
HTNW

1
@StephenKitt ส่วนที่คุณอ้างถึงยังระบุด้วย: "ในเซสชันแบบโต้ตอบหรือสคริปต์ที่มีคำสั่งอื่นอักขระพิเศษ <newline> หรือ <semicolon> ... จะไม่ถือว่าเป็นคำสั่งว่างที่อธิบายไว้ที่นี่เพราะพวกเขาจะถูกบริโภคโดยคนอื่น ส่วนของไวยากรณ์ " อืม ...
Wildcard

1
@ บัตรนกที่น่าสนใจฉันไม่ได้คิดถึงผลที่ตามมาของประโยคนั้นเมื่อค้นคว้าคำตอบของการติดตามของทิม การเปิดใช้งานโหมด POSIX ของ Bash จะไม่เปลี่ยนพฤติกรรมในเรื่องนี้ อืมแน่นอน ...
Stephen Kitt

2
@Wildcard: echo foo ; ; echo barในทุบตี 4.4 syntax error near unexpected token `;'กล่าวว่า dashให้ข้อผิดพลาดที่คล้ายกัน ในกรณีนี้มันเป็นคำสั่งที่ว่างเปล่าเพราะไม่มีส่วนอื่น ๆ ของไวยากรณ์ใช้มัน ฉันคิดว่าพวกเขาอาจพูดถึงเรื่องซ้ำซ้อน;ในตอนท้ายของบรรทัดเช่นsleep 100;(ขึ้นบรรทัดใหม่)
Peter Cordes

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