
Angenommen, ich habe mehrere Hintergrundaufgaben laufen, möchte nun aber zwei weitere Hintergrundaufgaben ausführen und nur auf die letzten beiden warten. Beispiel:
# long running commands
sleep 60 &
sleep 60 &
# now wait only for these two:
sleep 5 & sleep 5 & wait; echo waited only for the 5s sleeps.
Das Ergebnis des obigen Befehls ist, dass der Echo-Befehl 60 Sekunden wartet.
ich weiss ich kannÜbergeben Sie eine PID oder Job-ID, um zu warten. Da ich die Prozesse aber in einer Schleife starte for
, kann ich die PIDs nicht einfach abrufen.
Ich habe dies versucht, aber ohne Erfolg:
{ sleep 3 & sleep 5 & } wait; echo did not wait :
sleep 10 & { sleep 3 ; sleep 3 ; }& wait %2; echo only wait 3s
PS: Diese Frage ist eine Erweiterung vondiese einfachere Frage.
Antwort1
Sie könnten eine Subshell starten:
{ sleep 20 && echo second output ; }
( sleep 2 & wait && echo first output )
Der wait
Befehl in der Subshell ist nur dort gültig.
Antwort2
Basierend auf den Hinweisen von @Kusalananda in der einfacheren Frage habe ich mir dieses Beispiel ausgedacht. Vielleicht nicht das einfachste ...
Der gesamte Code unten befindet sich in einer interaktiven Shell. Ich habe ihn für die Antwort einfach in Teile zerlegt, da er sonst schwer zu lesen wäre.
Beachten Sie, dass in bash
Version 4.1 und älter das !
in ""
, eine Verlaufsersetzung in einer interaktiven Shell auslöst (dies wurde in Version 4.2 behoben). Das ist es, was mich ausgetrickst hat. Wenn Sie wirklich zitieren möchten, $!
können Sie "$! "
und das abschließende Leerzeichen verwenden, um zu verhindern, dass die Verlaufsersetzung einsetzt.
unset to_wait;
date;
sleep 3 &
for i in 1 2 3; do
sleep 1 &
# Don't put the ! in "" or you'll get an `event`.
to_wait+=( $! );
done;
wait "${to_wait[@]}";
date;
echo waited 1s for inner processes;
# wait for the rest of the processes (just for illustration)
wait;
date;
echo waited 3s for outer process;