我遇到了BASH无限循环的一些奇怪行为,其输出被流水线化到另一个进程。也就是说,我运行这两个命令:
(while true; do echo xxx; done) | head -n 1
(while true; do date; done) | head -n 1
第一个立即退出,而第二个不退出(我认为它将永远运行而不被杀死)。我也尝试了一个隐式的无限循环:
yes | head -n 1
它也会自行退出。在每种情况下,立即在屏幕上打印适当的输出线。我很好奇是什么决定这样的命令是否会完成。
答案 0 :(得分:7)
当head
退出时,括号表达式的标准输出将被关闭。如果使用外部命令(如date
),则循环将挂起。如果使用bash的内部命令,如echo
,则循环退出。为了证明,请使用
(while true; do /bin/echo xxx; done) | head -n 1
它会挂起。如果你使用
(while true; do date; echo $? 1>&2; sleep 1; done) | head -n 1
您将在第二轮看到date
命令返回错误退出代码,即除了零之外的其他内容。 Bash显然不会像内部命令遇到问题那样严重。我想知道这是打算还是bash中的错误。
为了确保退出循环,这似乎有效:
(set -e; while true; do date ; done) | head -n 1