Dash double semicolon (;;) syntax

valodzka picture valodzka · Jun 3, 2013 · Viewed 23.5k times · Source

I'm tried to find way to run multiple commands in parallel in sh and wait for it completion.

I've found that following doesn't work (sh: 1: Syntax error: ";" unexpected):

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

But this syntax works as expected:

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

But I don't understand what is the difference.

What is the meaning of ;; and when it should be used?

Answer

;; is only used in case constructs, to indicate the end of an alternative. (It's present where you have break in C.)

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

Syntactically, ; and & both mark the end of a command. A newline is equivalent to ;, in a first approximation. The difference between them is that ; or newline indicates that the command must be executed in the foreground, whereas & indicates that the command must be executed in the background.

So here you need & wait. & ; is a syntax error (you can't have an empty command). & ;; is also a syntax error; ash lets it go (as if you'd written just &), but bash complains. Evidently your sh is some ash variant (such as dash, which is /bin/sh on many Debian derivatives).