gpt4 book ai didi

bash - 退出管道中的 BASH 无限循环

转载 作者:行者123 更新时间:2023-11-29 09:00:10 25 4
gpt4 key购买 nike

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

关于bash - 退出管道中的 BASH 无限循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21732248/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com