2013-06-03 14 views
24

Próbuję znaleźć sposób uruchomienia wielu poleceń równolegle w sh i czekać na zakończenie. Odkryłem, że po nie działa (sh: 1: Syntax error: ";" unexpected):kreska podwójna średnik (;;) składnia

sh -c '(sleep 3 && echo 1) & ; (sleep 3 && echo 2) & ; wait' 

Ale ta składnia działa zgodnie z oczekiwaniami:

sh -c '(sleep 3 && echo 1) & ;; (sleep 3 && echo 2) & ;; wait' 

Ale ja nie rozumiem, co jest różnica. Moje pytanie brzmi: co oznacza ;; i kiedy powinno się go używać?

+3

nie działa tutaj żadna linia komend. ';;' jest separatorem opcji dla instrukcji 'case'. – Kent

+0

Przepraszam, myliłem się, w rzeczywistości daje błąd w bash, ale działa w desce rozdzielczej – valodzka

Odpowiedz

35

;; jest używany tylko w konstrukcjach case, aby wskazać koniec alternatywy. (Jest obecny, gdzie trzeba break w C)

case $answer in 
    yes) echo 'yay!';; 
    no) echo 'boo!';; 
esac 

Składniowo, ; i & zarówno zaznaczyć koniec polecenia. Nowa linia jest odpowiednikiem ;, w pierwszym przybliżeniu. Różnica między nimi polega na tym, że ; lub nowa linia oznacza, że ​​polecenie musi zostać wykonane na pierwszym planie, podczas gdy & wskazuje, że polecenie musi zostać wykonane w tle.

Tutaj potrzebna jest & wait. & ; jest błędem składni (nie możesz mieć pustego polecenia). & ;; to także błąd składniowy; ash pozwala odejść (tak jakbyś napisał tylko &), ale bash narzeka. Najwyraźniej twój sh jest odmianą popiołu (na przykład dash, który jest /bin/sh na wielu pochodnych Debiana).

+1

Cytując ważny bit: Syntaktycznie, ';' i '& oba oznaczają koniec polecenia. A więc potrzebujesz '& wait'. –

5

Powinno być używane w oświadczeniu case między przypadkami. Problem, który tutaj masz, polega na tym, że zarówno &, jak i są separatorami poleceń i powinieneś używać tylko jednego z nich.

+0

Dziękuję za wyjaśnienie, 'sh -c '(sleep 3 && echo 1) & (sleep 3 && echo 2) & wait'' działa zgodnie z oczekiwaniami. Nie wyjaśnia jednak, co oznacza ";;" w tym kontekście. – valodzka

+0

Czy jesteś pewien, że 'sh' to' bash'? –

+0

Przepraszam, myliłem się, to nie bash, to [dash] (http://gondor.apana.org.au/~herbert/dash/) – valodzka