web-dev-qa-db-fra.com

Syntaxe tiret double point-virgule (;;)

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é?

39
valodzka

;; 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).

57
Gilles

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.