将命令输出管道输入':'命令

时间:2018-03-09 19:25:13

标签: bash pipe colon sigpipe

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

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

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

<cmd> ||:

在我把这个打成一个错字之前,有没有人看过这种模式并且能够解释它的用例?

2 个答案:

答案 0 :(得分:9)

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

  • cmd | :cmd {s}输出到:。由于:会立即退出,如果cmd写入任何内容,则可能会遇到SIGPIPE信号或EPIPE错误,通常会将其删除。
  • cmd | :在子shell中运行cmd,取消var=valuecd /dir等环境变化。将cd /tmp || :cd /tmp | :进行比较。
  • 如果cmd | :已启用,则
  • set -o pipefail无法正常工作。

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

从技术上讲,它是一种竞争条件。 cmd可以在:退出之前写出一些内容,但不太可能。或者甚至更不可能,如果cmd写了很多并填满管道的缓冲区,它实际上会阻止直到 :退出,此时它正在等待{ {1}}系统调用将收到EPIPE / SIGPIPE。您可以使用write()

进行模拟

答案 1 :(得分:-1)

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

MAX()

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