我正在更新一个旧脚本,遇到了我不熟悉的模式:
# NOTE The | : always returns true so the <cmd> doesn't fail
<cmd> | :
我只在fork炸弹示例中看到过这种模式的使用。如果有人问我如何实现评论中所述的内容,我会建议:
<cmd> ||:
在将这归咎于打印错误之前,有没有人见过这种模式并能够解释它的用途?
cmd | :
将 cmd
的标准输出重定向到 :
。由于 :
立即退出,如果 cmd
输出任何内容,则很可能会收到 SIGPIPE 信号或 EPIPE 错误,通常导致其被终止。†cmd | :
在子 shell 中运行 cmd
,将类似于 var=value
或 cd /dir
的环境更改置空。比较 cd /tmp || :
和 cd /tmp | :
。cmd | :
如果启用了 set -o pipefail
,则无法正常工作。根据评论应该是 || :
。
† 从技术上讲,这是一种竞争条件。在 :
退出之前,cmd
可能会写入某些内容,尽管这是不太可能的。或者更不可能的是,如果 cmd
写了很多并且填满了管道缓冲区,它实际上将被阻塞,直到 :
退出,此时它未决的 write()
系统调用将接收到 EPIPE/SIGPIPE。你可以使用 strace -e write yes | { sleep 0.1; :; }
模拟这种情况。
我认为这是一种抑制命令标准输出的方法,它相当于:
<cmd> > /dev/null
我觉得这在脚本中很有用,你不想显示 cmd 的输出
:
/true
的副本已经退出后尝试写入其 stdout 时,| :
会导致失败,而> /dev/null
则适用于任意数量的内容。 - Charles Duffy