【问题标题】:Piping a command's output to ':' command将命令的输出通过管道传输到“:”命令
【发布时间】:2018-08-18 10:34:07
【问题描述】:

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

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

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

<cmd> ||:

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

【问题讨论】:

    标签: bash pipe colon sigpipe


    【解决方案1】:

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

    • cmd | : 管道 cmd 的标准输出到 :。由于: 立即退出,如果cmd 写入任何内容,它可能会受到 SIGPIPE 信号或 EPIPE 错误的影响,通常会杀死它。
    • cmd | : 在子shell 中运行cmd,使var=valuecd /dir 等环境变化无效。比较 cd /tmp || :cd /tmp | :
    • 如果启用了set -o pipefailcmd | : 将不起作用。

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

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

    模拟这个

    【讨论】:

      【解决方案2】:

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

      <cmd> > /dev/null
      

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

      【讨论】:

      • 不等价。当左侧的程序在:/true 的副本已经退出后尝试写入其标准输出时,| : 将导致失败,而&gt; /dev/null 将适用于任意数量的内容。
      • @CharlesDuffy 所以,一句话,如果cmd的输出太大会报错?
      猜你喜欢
      • 2019-08-17
      • 2016-04-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-08
      • 2013-10-13
      • 2011-06-28
      相关资源
      最近更新 更多