58

我正在尝试找到一种方法来并行运行多个命令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'

但我不明白有什么区别。

它是什么意思,什么;;时候应该使用?

4

2 回答 2

85

;;仅在case构造中使用,以指示替代方案的结束。(它出现在你break在 C 中的位置。)

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

在语法上,;两者&都标志着命令的结束。换行符;大致相当于 , 。它们之间的区别在于;or newline 表示该命令必须在前台执行,而&表示该命令必须在后台执行。

所以在这里你需要& wait. & ;是一个语法错误(你不能有一个空的命令)。& ;;也是语法错误;ash 让它走(就好像你刚才写的一样&),但是 bash 抱怨。显然,您的 sh 是一些 ash 变体(例如 dash,它/bin/sh在许多 Debian 衍生产品上)。

于 2013-06-03T21:01:58.193 回答
9

它应该case在案例之间的语句中使用。您在这里遇到的问题是&;都是命令分隔符,您应该只使用其中一个。

于 2013-06-03T20:40:44.083 回答