2013-06-03 3 views
24

J'ai essayé de trouver le moyen d'exécuter plusieurs commandes en parallèle dans sh et d'attendre la fin. J'ai trouvé que suivant ne fonctionne pas (sh: 1: Syntax error: ";" unexpected):dash double-virgule (;;) syntaxe

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. Ma question est quelle est la signification de ;; et quand il devrait être utilisé?

+3

ni ligne de commande travaillé ici. ';;' est un séparateur d'option pour l'instruction 'case'. – Kent

+0

désolé, je me trompais, il donne effectivement une erreur dans bash, mais fonctionne dans le tableau de bord – valodzka

Répondre

35

;; est utilisé uniquement 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 & marquer à la fois la fin d'une commande. Une nouvelle ligne est équivalente à ;, 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. Vous avez besoin de & wait. & ; est une erreur de syntaxe (vous ne pouvez pas avoir une commande vide). & ;; est également une erreur de syntaxe; ash le laisse aller (comme si vous aviez écrit juste &), mais bash se plaint. Évidemment, votre sh est une variante de cendres (comme dash, qui est /bin/sh sur de nombreux dérivés de Debian).

+1

Citant le bit important: Syntactically, ';' et '& 'les deux marquent la fin d'une commande. Donc ici vous avez besoin de '& wait'. –

5

Il doit être utilisé dans une instruction case, entre les cas. Le problème que vous avez ici est que les deux & et ; sont des séparateurs de commandes, et vous ne devriez en utiliser qu'un seul.

+0

Merci pour la clarification, 'sh -c '(sommeil 3 && echo 1) & (sommeil 3 && echo 2) & wait'' fonctionne comme prévu. Cela n'explique pas ce que signifie ";;" dans ce contexte. – valodzka

+0

Êtes-vous sûr que 'sh' est' bash'? –

+0

Désolé, j'avais tort, ce n'est pas bash, il [tiret] (http://gondor.apana.org.au/~herbert/dash/) – valodzka