Hintergrundjob schleifen

81

Ich versuche, einen Hintergrundjob in einer for-Schleife in bash auszuführen:

for i in $(seq 3); do echo $i ; sleep 2 & ; done

Ich bekomme eine Fehlermeldung:

bash: syntax error near unexpected token `;'

In zsh funktioniert die Kommandozeile.

Bougui
quelle
3
Welches Bit möchten Sie in den Hintergrund stellen? Wie das liest, versuchen Sie, den Schlaf im Hintergrund zu machen, was sinnlos wäre.
BugFinder
4
Schlaf ist nur, um meine Schleife vor dem realen Fall zu testen.
Bougui

Antworten:

122

Entferne das ; nach dem Schlafen

for i in $(seq 3); do echo $i ; sleep 2 & done

Übrigens sollten solche Schleifen besser in separaten Zeilen mit korrekter Einrückung geschrieben werden (wenn Sie dies in eine Shell-Skriptdatei schreiben).

for i in $(seq 3)
do
   echo $i
   sleep 2 &
done
Gammay
quelle
4
Denken Sie daran, dass "sleep 2" nur in den Hintergrund gesendet wird.
Tamerlaha
Warum $isagt die Jobsteuerung, wenn ich dies mit dem Befehl im Hintergrund mache , dass der Prozessname $ianstelle des tatsächlichen Werts von enthält $i?
Michael
@Michael Volles Programm mit Ausgabe würde helfen, besser zu verstehen
Gammay
for I in <whatever>; do rm -fr $I & done... jobs-> rm -fr $Imehrmals, anstatt das eigentliche Verzeichnis für jeden Job zu löschen
Michael
Ich habe eine Antwort darauf, es ist lang. Ich denke, Sie sollten es als neue Frage posten (und diesen Fragenlink hier hinzufügen). Ich werde antworten und Sie werden auch mehr Antworten erhalten.
Gammay
42

Sie können den Hintergrundbefehl in () einfügen

for i in $(seq 3); do echo $i ; (sleep 2 &) ; done
Sogart
quelle
9
Bitte beachten Sie: Sie erstellen damit eine Subshell. Dies bedeutet auch, dass Sie nicht in der Lage sind, waitdie Hintergrundjobs zu beenden.
JFK