Usa & (e commerciale) in loop bash a linea singola


58

Ho usato questo comando con successo, che cambia una variabile in un file di configurazione, quindi esegue uno script Python all'interno di un ciclo:

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

Poiché ciascuno DoMyScript.pyrichiede circa 30 secondi per essere eseguito prima di terminare, mi piacerebbe relegarli in background mentre il successivo può essere generato.

Ho provato ciò che mi è familiare, aggiungendo una e commerciale come di seguito:

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

Tuttavia, ciò comporta l'errore seguente:

-bash: errore di sintassi vicino al token imprevisto `; '

Risposte:


85

Rilascia il ;dopo &. Questo è un requisito sintattico

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

1
Dannazione, 43 secondi troppo lenti :)
Martin von Wittich,

2
@MartinvonWittich, un +1 alla tua risposta a titolo di commiserazione ;-)
iruvar

4
Sebbene ciò risponda alla domanda, probabilmente non è ciò che l'OP vuole perché quando tutte le istanze di Python sono iniziate e inizializzano vedranno tutti un numbers.txtcontenimento 255.
Stéphane Chazelas,

1
Concordato con @StephaneChazelas, ma non sono sicuro di cosa possiamo fare realmente al riguardo con le informazioni fornite nella domanda. Una soluzione adeguata a ciò probabilmente ha bisogno di più contesto.
un CVn

3
Ecco il riferimento manuale di bash: gnu.org/software/bash/manual/bashref.html#Lists
glenn jackman,

14

Dato il commento di Stephane sulla risposta di 1_CR , probabilmente vuoi:

for i in {114..255}; do { echo $i > numbers.txt && python DoMyScript.py; } & done

Grazie Glenn. Ho provato alcune varianti del tuo codice che mi piacciono a causa della maggiore leggibilità, ma forse a causa del sonno extra di cui avevo bisogno, non funzionava per me. Ripeterebbe anche l'ultimo numero fornell'intervallo ... Ecco cosa sono felice al momento: for((i=1;i<100;i+=1)); do echo $i > numbers.txt;sleep 3; python DoMyScript.py & doneil punto principale della domanda su come eseguire il processo in background è risolto.
ljs.dev,

* ovviamente, avevo <=la domanda originale, quindi la gamma che hai fornito era totalmente adatta in base alle informazioni che ho fornito. Ancora una volta, grazie per il diverso approccio
ljs.dev

10

Perdere il ;:

for((i=114;i<=255;i+=1)); do echo $i > numbers.txt;python DoMyScript.py & done
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.