2013-06-03 12 views
24

shに複数のコマンドを並行して実行する方法を見つけようとしています。 私は(sh: 1: Syntax error: ";" unexpected)以下が動作しないことがわかってきました:ダッシュ・セミコロン(;;)の構文

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

しかし、予想通り、この構文は動作します:

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

をしかし、私は違いが何であるかを理解していません。 私の質問は、;;の意味は何ですか、それはいつ使用されるべきですか?

+3

どちらのコマンドラインもここでは機能しませんでした。 ';;'は 'case'文のオプションセパレータです。 – Kent

+0

申し訳ありません、私は間違っていましたが、実際にはbashでエラーが出ますが、ダッシュで動作します – valodzka

答えて

35

;;は、代替物の終わりを示すために、case構造でのみ使用されます。

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

(それはあなたがCでbreakを持っている存在だ)、;&の両方がコマンドの終わりをマーク。改行は、最初の近似では;に相当します。それらの違いは、;または改行は、コマンドがフォアグラウンドで実行されなければならないことを示し、&は、コマンドがバックグラウンドで実行されなければならないことを示します。

だからここには& waitが必要です。 & ;は構文エラーです(空のコマンドは使用できません)。 & ;;も構文エラーです。灰は(あなたがちょうど&を書いたかのように)行くことができますが、bashは文句を言います。明らかに、あなたのshはいくつかの灰変種(ダッシュなど、多くのDebian派生語で/bin/shです)です。

+1

重要なビットを引用:構文的に ';'と ' '両方ともコマンドの終わりを示します。だからここにあなたは '&wait'が必要です。 –

5

ケース間のcaseステートメントで使用する必要があります。ここで問題となっているのは、&;の両方がコマンド区切り文字であり、そのうちの1つだけを使用することです。

+0

sh -c(sleep 3 && echo 1)&(sleep 3 && echo 2)&wait''が動作しています予想通り。この文脈では、「;;」とは何かを意味するものではありません。 – valodzka

+0

'sh'は' bash'ですか? –

+0

申し訳ありません、私は間違っていました、それはbashではありません、それはダッシュ(http://gondor.apana.org.au/~herbert/dash/) – valodzka

関連する問題