将命令输出导入“:”命令

9

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

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

我只在fork炸弹示例中看到过这种模式的使用。如果有人问我如何实现评论中所述的内容,我会建议:

<cmd> ||:

在将这归咎于打印错误之前,有没有人见过这种模式并能够解释它的用途?
2个回答

8
这是一个错别字,但它也会产生类似的效果。区别如下:
  • cmd | :cmd 的标准输出重定向到 :。由于 : 立即退出,如果 cmd 输出任何内容,则很可能会收到 SIGPIPE 信号或 EPIPE 错误,通常导致其被终止。
  • cmd | : 在子 shell 中运行 cmd,将类似于 var=valuecd /dir 的环境更改置空。比较 cd /tmp || :cd /tmp | :
  • cmd | : 如果启用了 set -o pipefail,则无法正常工作。

根据评论应该是 || :

从技术上讲,这是一种竞争条件。在 : 退出之前,cmd 可能会写入某些内容,尽管这是不太可能的。或者更不可能的是,如果 cmd 写了很多并且填满了管道缓冲区,它实际上将被阻塞,直到 : 退出,此时它未决的 write() 系统调用将接收到 EPIPE/SIGPIPE。你可以使用 strace -e write yes | { sleep 0.1; :; } 模拟这种情况。


-1

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

<cmd> > /dev/null

我觉得这在脚本中很有用,你不想显示 cmd 的输出


不等价。当左侧程序在 :/true 的副本已经退出后尝试写入其 stdout 时,| : 会导致失败,而 > /dev/null 则适用于任意数量的内容。 - Charles Duffy
@CharlesDuffy,简单来说,如果cmd的输出太大,它会产生错误吗? - Gustavo Topete

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接