Comment écrire une boucle for qui exécute une commande asynchrone à chaque itération?

23

Je me demande pourquoi il y a une erreur lors de l'utilisation d'une commande asynchrone dans une boucle?

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

Si je l'écris comme

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

cela fonctionne bien.

Comment l'écrire sur une seule ligne sans erreur?

Tim
la source

Réponses:

39

Déposez le ;:

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

&sépare les commandes , donc le ;est étranger (et le shell attend quelque chose entre &et ;).

Stephen Kitt
la source
Merci. "le shell attend quelque chose entre & et;", alors pourquoi une commande vide n'est-elle pas correcte entre & et;?
Tim
5
La vraie commande no-op est:
HTNW
1
@StephenKitt, la section à laquelle vous faites référence indique également: "Dans une session interactive ou un script avec d'autres commandes, les caractères <newline> ou <semicolon> supplémentaires ... ne seraient pas considérés comme la commande vide décrite ici car ils seraient consommés par d'autres parties de la grammaire. " Hmmm ...
Wildcard
1
@Wildcard c'est intéressant, je n'avais pas réfléchi aux conséquences de cette phrase en recherchant la réponse au suivi de Tim. L'activation du mode POSIX de Bash ne change pas son comportement à cet égard. Hmmm en effet ...
Stephen Kitt
2
@Wildcard: echo foo ; ; echo bardans bash 4.4 dit syntax error near unexpected token `;'. dashdonne une erreur similaire. Dans ce cas, il s'agit d'une commande vide car aucune autre partie de la grammaire ne la consomme. Je pense qu'ils pourraient parler de redondance ;à la fin d'une ligne comme sleep 100;(newline).
Peter Cordes
22

Regroupez vos doactions entre accolades:

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

Facile à comprendre pour vous comme pour Bash!

Pandya
la source