J'ai essayé de trouver un moyen d'exécuter plusieurs commandes en parallèle dans sh
et d'attendre qu'il se termine.
J'ai trouvé que ce qui suit ne fonctionne pas (sh: 1: Syntax error: ";" unexpected
):
sh -c '(sleep 3 && echo 1) & ; (sleep 3 && echo 2) & ; wait'
Mais cette syntaxe fonctionne comme prévu:
sh -c '(sleep 3 && echo 1) & ;; (sleep 3 && echo 2) & ;; wait'
Mais je ne comprends pas quelle est la différence.
Quel est le sens de ;;
et quand doit-il être utilisé?
;;
n'est utilisé que dans les constructions case
, pour indiquer la fin d'une alternative. (Il est présent là où vous avez break
en C.)
case $answer in
yes) echo 'yay!';;
no) echo 'boo!';;
esac
Syntaxiquement, ;
et &
les deux marquent la fin d'une commande. Une nouvelle ligne équivaut à ;
, en première approximation. La différence entre eux est que ;
ou newline indique que la commande doit être exécutée au premier plan, tandis que &
indique que la commande doit être exécutée en arrière-plan.
Alors là, vous avez besoin de & wait
. & ;
est une erreur de syntaxe (vous ne pouvez pas avoir de commande vide). & ;;
est également une erreur de syntaxe; ash laisse aller (comme si vous aviez écrit juste &
), mais bash se plaint. Évidemment, votre sh est une variante de cendre (comme le tiret, qui est /bin/sh
sur de nombreux dérivés Debian).
Il doit être utilisé dans une instruction case
, entre les cas. Le problème que vous rencontrez ici est que les deux &
et ;
sont des séparateurs de commandes, et vous ne devez utiliser que l'un d'eux.