繁体   English   中英

从管道中的BASH Infinite循环退出

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM