2013-06-03 94 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結構,以指示替代的結束。 (這是目前在那裏你在C有break

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

在語法上,;&都標記命令的結束。換行符相當於;,第一次近似。它們之間的區別在於;或換行符表示該命令必須在前臺執行,而&表示該命令必須在後臺執行。

所以在這裏你需要& wait& ;是一個語法錯誤(你不能有一個空的命令)。 & ;;也是一個語法錯誤;灰讓它去(如果你只寫&),但bash抱怨。顯然你的sh是一些灰變體(例如破折號,在許多Debian衍生物上是/bin/sh)。

+1

引用重要的一點:在句法上,';'和' 「都標誌着命令的結束。所以在這裏你需要'&wait'。 –

5

它應該用於case聲明之間的案例。你在這裏遇到的問題是&;都是命令分隔符,你應該只使用其中的一個。

+0

謝謝澄清,'sh -c'(sleep 3 && echo 1)&(sleep 3 && echo 2)&wait'' is working如預期。它並沒有解釋在這種情況下什麼是「......」的含義。 – valodzka

+0

你確定'sh'是'bash'嗎? –

+0

對不起,我錯了,它不是bash,它[破折號](http://gondor.apana.org.au/~herbert/dash/) – valodzka