退出管道中的 BASH 无限循环



我遇到了 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

相关内容

  • 没有找到相关文章

最新更新