【问题标题】:Dash double semicolon (;;) syntax破折号双分号 (;;) 语法
【发布时间】:2013-05-30 02:27:21
【问题描述】:

我正在尝试找到一种方法在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 语句的选项分隔符。
  • 对不起,我错了,它实际上在 bash 中给出了错误,但在 dash 中有效

标签: syntax sh dash-shell


【解决方案1】:

;; 仅用于case 构造中,表示替代的结束。 (它存在于 C 中 break 的位置。)

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

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

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

【讨论】:

  • 引用重要的一点:在语法上,;& 都标志着命令的结束。所以这里你需要& wait
【解决方案2】:

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

【讨论】:

  • 感谢您的澄清,sh -c '(sleep 3 && echo 1) & (sleep 3 && echo 2) & wait' 正在按预期工作。它没有解释在这种情况下;; 的含义。
  • 你确定shbash
  • 对不起,我错了,不是bash,是dash
猜你喜欢
  • 1970-01-01
  • 2016-06-06
  • 2014-01-01
  • 2011-08-28
  • 2011-12-17
  • 1970-01-01
  • 2020-08-03
  • 2021-01-24
  • 1970-01-01
相关资源
最近更新 更多