Come scrivere un ciclo for che esegue un comando asincrono in ogni iterazione?


23

Mi chiedo perché si sia verificato un errore durante l'utilizzo di un comando asincrono all'interno di un ciclo?

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

Se lo scrivo come

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

funziona benissimo.

Come posso scriverlo su una riga senza errori?

Risposte:


39

Rilascia il ;:

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

&separa i comandi , quindi ;è estraneo (e la shell si aspetta qualcosa tra &e ;).


Grazie. "la shell si aspetta qualcosa tra & e;", quindi perché un comando vuoto non è ok tra & e;?
Tim

5
Il vero comando no-op è:
HTNW,

1
@StephenKitt, la sezione a cui fai riferimento afferma anche: "In una sessione interattiva o uno script con altri comandi, i caratteri extra <newline> o <semicolon> ... non si qualificherebbero come il comando vuoto qui descritto perché sarebbero consumati da altri parti della grammatica ". Hmmm ...
Wildcard

1
@Wildcard è interessante, non avevo riflettuto sulle conseguenze di quella frase quando cercavo la risposta al follow-up di Tim. L'abilitazione della modalità POSIX di Bash non cambia il suo comportamento in questo senso. Hmmm davvero ...
Stephen Kitt,

2
@Wildcard: echo foo ; ; echo barnella bash 4.4 dice syntax error near unexpected token `;'. dashdà un errore simile. In questo caso, è un comando vuoto perché nessun'altra parte della grammatica lo consuma. Penso che potrebbero parlare di ridondanti ;alla fine di una riga come sleep 100;(newline).
Peter Cordes,

22

Raggruppa le tue doazioni tra parentesi graffe:

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

Facile da capire sia per te che per Bash!

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.