Use & (e comercial) no loop bash de linha única

58

Eu tenho usado esse comando com sucesso, que altera uma variável em um arquivo de configuração e executa um script Python dentro de um loop:

for((i=114;i<=255;i+=1)); do echo $i > numbers.txt;python DoMyScript.py; done

Como cada um DoMyScript.pyleva cerca de 30 segundos para ser executado antes de terminar, eu gostaria de relegá-los ao segundo plano, enquanto o próximo pode ser gerado.

Tentei o que estou familiarizado adicionando um e comercial como abaixo:

for((i=114;i<=255;i+=1)); do echo $i > numbers.txt;python DoMyScript.py &; done

No entanto, isso resulta no erro abaixo:

-bash: erro de sintaxe próximo ao token inesperado `; '

ljs.dev
fonte

Respostas:

85

Solte o ;depois &. Este é um requisito sintático

for((i=114;i<=255;i+=1)); do echo $i > numbers.txt;python DoMyScript.py & done
iruvar
fonte
11
Droga, 43 segundos demasiado lento :)
Martin von Wittich
2
@MartinvonWittich, um +1 a sua resposta por meio de comiseração ;-)
Iruvar
4
Embora isso responda à pergunta, provavelmente não é o que o OP deseja, no momento em que todas as instâncias do python foram iniciadas e inicializadas, todas elas verão uma numbers.txtcontenção 255.
Stéphane Chazelas
11
Concordou com @StephaneChazelas, mas não sei ao certo o que podemos fazer sobre isso com as informações fornecidas na pergunta. Uma solução adequada para isso provavelmente precisa de mais contexto.
um CVn 20/09/2013
3
Aqui é a referência manual do bash: gnu.org/software/bash/manual/bashref.html#Lists
glenn jackman
14

Dado o comentário de Stephane na resposta de 1_CR , você provavelmente deseja:

for i in {114..255}; do { echo $i > numbers.txt && python DoMyScript.py; } & done
Glenn Jackman
fonte
Obrigado Glenn. Eu tentei algumas variações do seu código que eu gosto devido à maior legibilidade, mas talvez devido ao sono extra que eu precisava, não estava funcionando para mim. Ele também repetiria o último número no forintervalo ... Aqui está o que eu estou feliz no momento: for((i=1;i<100;i+=1)); do echo $i > numbers.txt;sleep 3; python DoMyScript.py & doneO principal ponto de interrogação da execução do processo em segundo plano está resolvido.
Ljs.dev 21/09/2013
* é claro, eu tinha <=na pergunta original, então o intervalo que você forneceu foi totalmente adequado com base nas informações que forneci. Mais uma vez, obrigado pela abordagem diferente
ljs.dev 21/09/13
10

Perca o ;:

for((i=114;i<=255;i+=1)); do echo $i > numbers.txt;python DoMyScript.py & done
Martin von Wittich
fonte