¿Cómo escribir un bucle for que ejecuta un comando asincrónico en cada iteración?

23

Me pregunto por qué hay un error al usar un comando asíncrono dentro de un bucle.

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

Si lo escribo como

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

Esto funciona bien.

¿Cómo puedo escribirlo en una línea sin error?

Tim
fuente

Respuestas:

39

Suelta el ;:

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

&separa los comandos , por lo que ;es extraño (y el shell espera algo entre &y ;).

Stephen Kitt
fuente
Gracias. "el shell espera algo entre & y;", entonces ¿por qué no está bien un comando vacío entre & y;?
Tim
55
El verdadero comando sin
operación
1
@StephenKitt, la sección a la que hace referencia también dice: "En una sesión interactiva o una secuencia de comandos con otros comandos, los caracteres <newline> o <semicolon> adicionales ... no calificarían como el comando vacío descrito aquí porque serían consumidos por otros partes de la gramática ". Hmmm ...
Comodín el
1
@Wildcard es interesante, no había pensado en las consecuencias de esa oración al investigar la respuesta al seguimiento de Tim. Habilitar el modo POSIX de Bash no cambia su comportamiento a este respecto. Hmmm de hecho ...
Stephen Kitt
2
@Wildcard: echo foo ; ; echo baren bash 4.4 dice syntax error near unexpected token `;'. dashda un error similar En este caso, es un comando vacío porque ninguna otra parte de la gramática lo consume. Creo que podrían estar hablando de redundantes ;al final de una línea como sleep 100;(nueva línea).
Peter Cordes
22

Agrupe sus doacciones entre llaves:

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

¡Fácil de entender para ti y para Bash!

Pandya
fuente