【发布时间】:2012-02-17 01:38:37
【问题描述】:
我在 bash 中使用了多个命令的管道。如果其中一个命令失败,是否可以配置 bash 以立即终止整个管道中的所有命令?
在我的例子中,第一个命令,比如command1,会运行一段时间,直到它产生一些输出。例如,您可以将command1 替换为(sleep 5 && echo "Hello")。
现在,command1 | false 确实会在 5 秒后失败,但不会立即失败。
这种行为似乎与命令产生的输出量有关。例如,find / | false 立即返回。
总的来说,我想知道为什么 bash 会这样。谁能想象像command1 | non-existing-command 这样的代码不会立即退出的任何情况?
PS:使用临时文件对我来说不是一个选项,因为我传输的中间结果太大而无法存储。
PPS:set -e 和 set -o pipefail 似乎都不会影响这种现象。
【问题讨论】:
-
这个问题更适合unix.stackexchange.com。你可能会在那里得到一个很好的答案。