web-dev-qa-db-fra.com

Erreur de syntaxe dans la boucle for lors de la redirection de la sortie vers un fichier en arrière-plan

J'essaie d'analyser certains fichiers journaux à l'aide d'un script et, comme ils peuvent tous être analysés indépendamment, j'essaie de les exécuter en arrière-plan. J'utilise la commande suivante mais j'obtiens l'erreur de syntaxe indiquée juste après:

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 `;'

Bien que, si je lance le script run_parser.sh un par un, sans la boucle, il fonctionne correctement. Quelque chose comme:

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

fonctionne parfaitement bien.

Aussi, j'ai déjà essayé:

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

ce qui a également fonctionné, mais la redirection de sortie ne fonctionnait pas et tout était imprimé à l'écran.

7
Wajahat

Vous devriez placer la commande d'arrière-plan dans () comme ceci:

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
6
Yaron

Vous n'avez pas besoin d'un ; après un &, le & lui-même agissant en tant que séparateur de commande. Voir la section "Liste des commandes" dans le Manuel de référence de Bash .

Ceci exécutera trois ping simultanés:

ping -c 3 askubuntu.com & ping -c 3 askubuntu.com & ping -c 3 askubuntu.com &
6
xenoid