Syntaxfehler in der for-Schleife beim Umleiten der Ausgabe in eine Datei im Hintergrund

7

Ich versuche, einige Protokolldateien mithilfe eines Skripts zu analysieren, und da alle unabhängig voneinander analysiert werden können, versuche ich, sie im Hintergrund auszuführen. Ich verwende den folgenden Befehl, erhalte jedoch den folgenden Syntaxfehler:

for k in {2..3}; do for i in {1..3}; do for j in {1..3}; do ./run_parser.sh ${k} ${i} ${j} > parse_${k}${i}${j}.log 2>&1 &; done; done; done
-bash: syntax error near unexpected token `;'

Obwohl, wenn ich das run_parser.shSkript einzeln ohne die Schleife ausführe , läuft es gut. Etwas wie:

./run_parser.sh 2 1 2 > parse_212.log 2>&1 &

funktioniert einwandfrei.

Außerdem habe ich zuvor versucht:

for k in {2..3}; do for i in {1..3}; do for j in {1..3}; do ./run_parser.sh ${k} ${i} ${j} & > parse_${k}${i}${j}.log ; done; done; done

Das funktionierte auch, aber die Ausgabeumleitung funktionierte nicht und alles wurde auf dem Bildschirm gedruckt.

Wajahat
quelle

Antworten:

6

Sie sollten den Hintergrundbefehl ()wie folgt einfügen :

for k in {2..3}; do for i in {1..3}; do for j in {1..3}; do (./run_parser.sh ${k} ${i} ${j} > parse_${k}${i}${j}.log 2>&1 &); done; done; done
Yaron
quelle
Dies erzeugt eine zusätzliche, aber ziemlich sinnlose Unterschale für jede Ausführung der inneren Schleife.
David Foerster
6

Sie brauchen kein ;nach a &, das &selbst fungiert als Befehlstrennzeichen. Siehe den Abschnitt "Liste der Befehle" im Bash-Referenzhandbuch .

Dadurch werden drei gleichzeitig ausgeführt ping:

ping -c 3 askubuntu.com & ping -c 3 askubuntu.com & ping -c 3 askubuntu.com &
Xenoid
quelle
Das funktioniert auch.
Wajahat
3
Nein, das ist die andere (das Hinzufügen von Klammern, um ein Semikolon zu kompensieren, das überhaupt nicht vorhanden sein sollte), das "auch funktioniert". :)
Xenoid