web-dev-qa-db-ja.com

ダッシュダブルセミコロン(;;)構文

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'

しかし、私は違いが何であるか理解していません。

;;の意味と、それをいつ使用する必要があるか?

39
valodzka

;;は、代替の終了を示すために、case構成体でのみ使用されます。 (Cでbreakがある場所に存在します。)

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

構文的には、;&はどちらもコマンドの終わりを示します。改行は、最初の近似では;と同等です。それらの違いは、;または改行はコマンドをフォアグラウンドで実行する必要があることを示し、&はコマンドをバックグラウンドで実行する必要があることを示します。

したがって、ここでは& waitが必要です。 & ;は構文エラーです(空のコマンドは使用できません)。 & ;;も構文エラーです。 ashは(&だけを記述したかのように)それを許可しますが、bashは文句を言います。明らかにあなたのshはいくつかの灰の変形(多くのDebian派生物では/bin/shであるダッシュなど)です。

57
Gilles

ケース間でcaseステートメントで使用する必要があります。あなたがここで抱えている問題は、両方の&および;はコマンドの区切り文字であり、使用するのはいずれか1つだけにしてください。