9

我正在更新一个旧脚本,遇到了一个我不熟悉的模式:

# NOTE The | : always returns true so the <cmd> doesn't fail
<cmd> | :

我只在叉子炸弹示例中看到过这种模式。如果有人问我如何完成评论中所述的内容,我会建议:

<cmd> ||:

在我把这归结为一个错字之前,有没有人见过这种模式并能够解释它的用例?

4

2 回答 2

9

这是一个错字,也恰好有类似的效果。差异:

  • cmd | :管道cmd的标准输出到:. 由于:立即退出,如果cmd写入任何内容,它可能会受到 SIGPIPE 信号或 EPIPE 错误的影响,通常会杀死它。†</sup>
  • cmd | :cmd在子外壳中运行,消除环境变化,如var=valueor cd /dir。比较。cd /tmp || :_cd /tmp | :
  • cmd | :set -o pipefail如果启用将不起作用。

根据评论,它应该是|| :

†</sup> 从技术上讲,这是一个竞争条件。cmd可以在退出之前写一些东西:,尽管这不太可能。或者更不可能的是,如果cmd写了很多并填满了管道的缓冲区,它实际上会阻塞直到 :退出,此时它的挂起write()系统调用将收到 EPIPE/SIGPIPE。你可以用strace -e write yes | { sleep 0.1; :; }

于 2018-03-09T19:36:14.070 回答
-1

我认为这是一种抑制命令标准输出的方法,它相当于:

<cmd> > /dev/null

我认为它在您不想显示 cmd 输出的脚本中很有用

于 2018-03-09T19:31:23.470 回答