Trabajo en segundo plano en bucle

81

Intento ejecutar un trabajo en segundo plano en un bucle for en bash:

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

Me sale un error:

bash: syntax error near unexpected token `;'

En zsh, la línea de comandos funciona.

bougui
fuente
3
¿Qué parte intentas colocar en segundo plano? como dice, estás tratando de dormir en segundo plano, lo que no tendría sentido ..
BugFinder
4
dormir es solo para probar mi bucle antes del caso real.
bougui

Respuestas:

123

Eliminar el ; después de dormir

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

Por cierto, estos bucles se escriben mejor en líneas separadas con la sangría adecuada (si está escribiendo esto en un archivo de script de shell).

for i in $(seq 3)
do
   echo $i
   sleep 2 &
done
gammay
fuente
4
Tenga en cuenta que enviará "sleep 2" solo al fondo.
tamerlaha
¿Por qué cuando hago esto con $iel comando en segundo plano, el control de trabajo dice que el nombre del proceso contiene en $ilugar de lo que sea el valor real de $iera?
Michael
@Michael El programa completo con salida ayudaría a comprender mejor
gammay
for I in <whatever>; do rm -fr $I & done... jobs-> rm -fr $Ivarias veces, en lugar de eliminar el directorio real para cada trabajo
Michael
Tengo respuesta para esto, es largo. Así que creo que debería publicarlo como una nueva pregunta (y agregar el enlace de la pregunta aquí), responderé y también obtendrá más respuestas.
gammay
42

Puede poner el comando de fondo en ()

for i in $(seq 3); do echo $i ; (sleep 2 &) ; done
sogart
fuente
9
Tenga en cuenta: crea una subcapa con eso. También significa que no podrá waitfinalizar los trabajos en segundo plano.
JFK