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