Como escrever um loop for que executa um comando assíncrono em cada iteração?

23

Gostaria de saber por que há um erro ao usar um comando assíncrono dentro de um loop?

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

Se eu escrever como

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

isso funciona bem.

Como escrever em uma linha sem erros?

Tim
fonte

Respostas:

39

Solte o ;:

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

&separa os comandos , portanto ;é estranho (e o shell espera algo entre &e ;).

Stephen Kitt
fonte
Obrigado. "o shell espera algo entre & e;", então por que um comando vazio não está ok entre & e;?
Tim
5
O verdadeiro comando no-op é:
HTNW 18/09
1
@StephenKitt, a seção que você menciona também declara: "Em uma sessão interativa ou em um script com outros comandos, caracteres <newline> ou <semicolon> extras ... não se qualificariam como o comando vazio descrito aqui, porque seriam consumidos por outros partes da gramática ". Hmmm ...
Caractere curinga
1
@Wildcard que é interessante, eu não tinha pensado nas consequências dessa frase ao pesquisar a resposta para o acompanhamento de Tim. A ativação do modo POSIX do Bash não altera seu comportamento nesse sentido. Hmmm, de fato ...
Stephen Kitt
2
@Wildcard: echo foo ; ; echo barna festança 4.4 diz syntax error near unexpected token `;'. dashdá um erro semelhante. Nesse caso, é um comando vazio porque nenhuma outra parte da gramática o consome. Eu acho que eles podem estar falando de redundância ;no final de uma linha como sleep 100;(nova linha).
Pedro Cordes
22

Agrupe suas doações entre colchetes:

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

Fácil de entender para você e para o Bash!

Pandya
fonte