[英]Exit from BASH Infinite loop in a pipeline
我遇到了一个有点奇怪的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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.