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'
しかし、私は違いが何であるか理解していません。
;;
の意味と、それをいつ使用する必要があるか?
;;
は、代替の終了を示すために、case
構成体でのみ使用されます。 (Cでbreak
がある場所に存在します。)
case $answer in
yes) echo 'yay!';;
no) echo 'boo!';;
esac
構文的には、;
と&
はどちらもコマンドの終わりを示します。改行は、最初の近似では;
と同等です。それらの違いは、;
または改行はコマンドをフォアグラウンドで実行する必要があることを示し、&
はコマンドをバックグラウンドで実行する必要があることを示します。
したがって、ここでは& wait
が必要です。 & ;
は構文エラーです(空のコマンドは使用できません)。 & ;;
も構文エラーです。 ashは(&
だけを記述したかのように)それを許可しますが、bashは文句を言います。明らかにあなたのshはいくつかの灰の変形(多くのDebian派生物では/bin/sh
であるダッシュなど)です。
ケース間でcase
ステートメントで使用する必要があります。あなたがここで抱えている問題は、両方の&
および;
はコマンドの区切り文字であり、使用するのはいずれか1つだけにしてください。