Verwenden Sie & (kaufmännisches Und) in einer einzeiligen Bash-Schleife

58

Ich habe diesen Befehl erfolgreich verwendet, der eine Variable in einer Konfigurationsdatei ändert und dann ein Python-Skript in einer Schleife ausführt:

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

Da es jeweils DoMyScript.pyungefähr 30 Sekunden dauert, bis sie beendet sind, möchte ich sie in den Hintergrund verschieben, während die nächste erzeugt werden kann.

Ich habe versucht, mit was ich vertraut bin, indem ich ein kaufmännisches Und wie folgt hinzufügte:

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

Dies führt jedoch zu dem folgenden Fehler:

-bash: Syntaxfehler in der Nähe des unerwarteten Tokens `; '

ljs.dev
quelle

Antworten:

85

Lass das ;nachher fallen &. Dies ist eine syntaktische Anforderung

for((i=114;i<=255;i+=1)); do echo $i > numbers.txt;python DoMyScript.py & done
iruvar
quelle
1
Verdammt, 43 Sekunden zu langsam :)
Martin von Wittich
2
@MartinvonWittich, eine +1 auf Ihre Antwort als Mitwirkung ;-)
iruvar
4
Während dies die Frage beantwortet, ist es wahrscheinlich nicht das, was das OP will, da zu dem Zeitpunkt, zu dem alle Python-Instanzen gestartet und initialisiert wurden, alle ein numbers.txtContaining sehen 255.
Stéphane Chazelas
1
Einverstanden mit @StephaneChazelas, aber ich bin nicht sicher, was wir mit den in der Frage angegebenen Informationen wirklich tun können. Eine richtige Lösung dafür braucht wahrscheinlich mehr Kontext.
ein Lebenslauf vom
3
Hier ist die Referenz zum Bash-Handbuch: gnu.org/software/bash/manual/bashref.html#Lists
Glenn Jackman
14

Angesichts von Stephanes Kommentar zu 1_CRs Antwort möchten Sie wahrscheinlich:

for i in {114..255}; do { echo $i > numbers.txt && python DoMyScript.py; } & done
Glenn Jackman
quelle
Danke Glenn. Ich habe ein paar Variationen Ihres Codes ausprobiert, die mir aufgrund der besseren Lesbarkeit gefallen, aber vielleicht aufgrund des zusätzlichen Schlafes, den ich brauchte, hat es für mich nicht funktioniert. Es würde auch die letzte Zahl im forBereich wiederholen ... Hier ist, womit ich im Moment zufrieden bin: for((i=1;i<100;i+=1)); do echo $i > numbers.txt;sleep 3; python DoMyScript.py & doneDie Hauptfrage, ob der Prozess im Hintergrund ausgeführt werden soll, ist gelöst.
ljs.dev
* Natürlich hatte ich <=in der ursprünglichen Frage, so dass der Bereich, den Sie geliefert haben, auf der Grundlage der von mir gelieferten Informationen völlig geeignet war. Nochmals
vielen
10

Verliere das ;:

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