Wie schreibe ich eine for-Schleife, die in jeder Iteration einen asynchronen Befehl ausführt?

23

Ich frage mich, warum bei der Verwendung eines asynchronen Befehls in einer Schleife ein Fehler auftritt.

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

Wenn ich es als schreibe

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

das funktioniert gut.

Wie kann ich es ohne Fehler in eine Zeile schreiben?

Tim
quelle

Antworten:

39

Lass das fallen ;:

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

&trennt Befehle , das ;ist also irrelevant (und die Shell erwartet etwas zwischen &und ;).

Stephen Kitt
quelle
Vielen Dank. "Die Shell erwartet etwas zwischen & und;", warum ist ein leerer Befehl zwischen & und; nicht in Ordnung?
Tim
5
Der echte No-Op-Befehl lautet:
HTNW
1
@StephenKitt, in dem Abschnitt, auf den Sie verweisen, heißt es auch: "In einer interaktiven Sitzung oder einem Skript mit anderen Befehlen gelten zusätzliche <newline> - oder <semicolon> -Zeichen nicht als der hier beschriebene leere Befehl, da sie von anderen verwendet würden Teile der Grammatik. " Hmmm ...
Wildcard
1
@Wildcard Das ist interessant, ich hatte nicht über die Konsequenzen dieses Satzes nachgedacht, als ich nach der Antwort auf Tims Follow-up gesucht hatte. Das Aktivieren des POSIX-Modus von Bash ändert diesbezüglich nichts an seinem Verhalten. Hmmm in der Tat ...
Stephen Kitt
2
@Wildcard: echo foo ; ; echo barin der bash 4.4 steht syntax error near unexpected token `;'. dashgibt einen ähnlichen Fehler. In diesem Fall handelt es sich um einen leeren Befehl, da er von keinem anderen Teil der Grammatik verwendet wird. Ich denke, sie sprechen über redundante ;am Ende einer Zeile wie sleep 100;(Newline).
Peter Cordes
22

Gruppieren Sie Ihre doAktionen in geschweiften Klammern:

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

Leicht zu verstehen für Sie und für Bash!

Pandya
quelle