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.