我遇到了 BASH 无限循环的奇怪行为,该行为的输出被管道传输到另一个进程。也就是说,我运行这两个命令:
(while true; do echo xxx; done) | head -n 1
(while true; do date; done) | head -n 1
第一个立即退出,而第二个不会(我认为它会永远运行而不会被杀死)。我还尝试了一个隐式无限循环:
yes | head -n 1
它也会自行退出。在每种情况下,适当的输出行都会立即打印在屏幕上。我只是好奇是什么决定了这样的命令是否会结束。
当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