Use & (ampersand) en el bucle bash de una sola línea

58

He estado usando este comando con éxito, que cambia una variable en un archivo de configuración y luego ejecuta un script de Python dentro de un bucle:

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

Como cada uno DoMyScript.pytarda unos 30 segundos en ejecutarse antes de finalizar, me gustaría relegarlos a un segundo plano mientras se puede generar el siguiente.

He intentado con lo que estoy familiarizado, agregando un ampersand como a continuación:

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

Sin embargo, esto da como resultado el siguiente error:

-bash: error de sintaxis cerca del token inesperado `; '

ljs.dev
fuente

Respuestas:

85

Suelta el ;después &. Este es un requisito sintáctico

for((i=114;i<=255;i+=1)); do echo $i > numbers.txt;python DoMyScript.py & done
iruvar
fuente
1
Maldición, 43 segundos demasiado lento :)
Martin von Wittich
2
@MartinvonWittich, un +1 a su respuesta a modo de
compasión
44
Si bien eso responde a la pregunta, probablemente no sea lo que quiere el OP, ya que cuando todas las instancias de Python hayan comenzado e inicializado, todos verán un numbers.txtcontenido 255.
Stéphane Chazelas
1
Estoy de acuerdo con @StephaneChazelas, pero no estoy seguro de lo que realmente podemos hacer al respecto con la información proporcionada en la pregunta. Una solución adecuada a eso probablemente necesita más contexto.
un CVn
3
Aquí está la referencia del manual de bash: gnu.org/software/bash/manual/bashref.html#Lists
glenn jackman
14

Dado el comentario de Stephane sobre la respuesta de 1_CR , probablemente quieras:

for i in {114..255}; do { echo $i > numbers.txt && python DoMyScript.py; } & done
Glenn Jackman
fuente
Gracias Glenn Intenté algunas variaciones de su código que me gustan debido a la mayor legibilidad, pero tal vez debido al sueño adicional que necesitaba, no me estaba funcionando. También repetiría el último número en el forrango ... Esto es lo que me satisface en este momento: for((i=1;i<100;i+=1)); do echo $i > numbers.txt;sleep 3; python DoMyScript.py & donese resuelve el punto principal de la pregunta para lograr que el proceso se ejecute en segundo plano.
ljs.dev
* por supuesto, tenía <=en la pregunta original, por lo que el rango que proporcionó fue totalmente adecuado en función de la información que proporcioné. Nuevamente, gracias por el enfoque diferente
ljs.dev
10

Perder el ;:

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