
Supongamos que tengo varias tareas en segundo plano en ejecución, pero ahora quiero ejecutar dos tareas en segundo plano más, pero espero solo las dos últimas. Por ejemplo:
# 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.
El resultado del comando anterior es que el comando echo espera 60 segundos.
Sé que puedopasar un pid o jobid para esperar. Pero como estoy iniciando los procesos en un for
bucle, no puedo obtener los PID fácilmente.
Intenté esto, pero no tuve suerte:
{ sleep 3 & sleep 5 & } wait; echo did not wait :
sleep 10 & { sleep 3 ; sleep 3 ; }& wait %2; echo only wait 3s
PD: Esta pregunta es una extensión deesta pregunta más simple.
Respuesta1
Podrías iniciar una subcapa:
{ sleep 20 && echo second output ; }
( sleep 2 & wait && echo first output )
El wait
comando en el subshell sólo será válido allí.
Respuesta2
Basado en la guía de @Kusalananda en la pregunta más simple, se me ocurrió este ejemplo. Quizás no sea el más simple...
Todo el código siguiente está en un shell interactivo. Simplemente lo dividí en partes para la respuesta porque de otro modo sería difícil de leer.
Tenga en cuenta que en bash
la versión 4.1 y anteriores, !
en ""
, activa la sustitución del historial en un shell interactivo (esto se solucionó en la versión 4.2). Eso es lo que me estaba engañando. Si realmente desea cotizar, $!
puede utilizarlo "$! "
y el espacio final evitará que se active la sustitución del historial.
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;