将命令的输出通过管道传输到“:”命令
Piping a command's output to ':' command
我正在更新一个旧脚本并遇到一个我不熟悉的模式:
# NOTE The | : always returns true so the <cmd> doesn't fail
<cmd> | :
我只在叉子炸弹示例中见过这种模式。如果有人问我如何完成评论中所述的内容,我会建议:
<cmd> ||:
在我将其归结为打字错误之前,有没有人见过这种模式并能够解释它的用例?
我认为这是一种抑制命令标准输出的方法,相当于:
<cmd> > /dev/null
我发现它在您不想显示 cmd 输出的脚本中很有用
这是一个打字错误,也恰好有类似的效果。差异:
cmd | :
将 cmd
的标准输出通过管道传输到 :
。由于 :
立即退出,如果 cmd
写入任何内容,它可能会被 SIGPIPE 信号或 EPIPE 错误击中,通常会杀死它。†
cmd | :
在子 shell 中运行 cmd
,使 var=value
或 cd /dir
等环境变化无效。比较 cd /tmp || :
与 cd /tmp | :
.
如果启用 set -o pipefail
,cmd | :
将不起作用。
根据评论应该是 || :
。
† 从技术上讲,这是一个竞争条件。 cmd
可以在 :
退出之前写一些东西,尽管这不太可能。或者更不可能,如果 cmd
写了很多它并填满了管道的缓冲区,它实际上会阻塞 直到 :
退出,此时它的待定 write()
系统调用将收到 EPIPE/SIGPIPE。你可以用 strace -e write yes | { sleep 0.1; :; }
来模拟
我正在更新一个旧脚本并遇到一个我不熟悉的模式:
# NOTE The | : always returns true so the <cmd> doesn't fail
<cmd> | :
我只在叉子炸弹示例中见过这种模式。如果有人问我如何完成评论中所述的内容,我会建议:
<cmd> ||:
在我将其归结为打字错误之前,有没有人见过这种模式并能够解释它的用例?
我认为这是一种抑制命令标准输出的方法,相当于:
<cmd> > /dev/null
我发现它在您不想显示 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; :; }