Bagaimana cara menulis for for yang menjalankan perintah asinkron di setiap iterasi?


23

Saya bertanya-tanya mengapa ada kesalahan menggunakan perintah asinkron dalam satu loop?

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

Jika saya menuliskannya sebagai

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

ini bekerja dengan baik.

Bagaimana saya bisa menulisnya dalam satu baris tanpa kesalahan?

Jawaban:


39

Jatuhkan ;:

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

&memisahkan perintah , sehingga tidak ;ada (dan shell mengharapkan sesuatu di antara &dan ;).


Terima kasih. "shell mengharapkan sesuatu antara & dan;", jadi mengapa tidak ada perintah kosong antara & dan;
Tim

5
Perintah no-op yang sebenarnya adalah:
HTNW

1
@StephenKitt, bagian yang Anda rujuk juga menyatakan: "Dalam sesi interaktif atau skrip dengan perintah lain, karakter <newline> atau <semicolon> tambahan ... tidak akan memenuhi syarat sebagai perintah kosong yang dijelaskan di sini karena akan dikonsumsi oleh yang lain bagian dari tata bahasa. " Hmmm ...
Wildcard

1
@Wildcard itu menarik, saya belum memikirkan konsekuensi dari kalimat itu ketika meneliti jawaban untuk tindak lanjut Tim. Mengaktifkan mode POSIX Bash tidak mengubah perilakunya dalam hal ini. Hmmm memang ...
Stephen Kitt

2
@ Kartu Memori: echo foo ; ; echo bardi bash 4.4 mengatakan syntax error near unexpected token `;'. dashmemberikan kesalahan serupa. Dalam hal ini, ini adalah perintah kosong karena tidak ada bagian lain dari tata bahasa yang mengkonsumsinya. Saya pikir mereka mungkin berbicara tentang berlebihan ;di akhir baris seperti sleep 100;(baris baru).
Peter Cordes

22

Kelompokkando tindakan Anda dalam kurung keriting:

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

Mudah dimengerti untuk Anda dan juga untuk Bash!

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.