加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

从管道中的BASH Infinite循环退出

发布时间:2020-12-15 21:54:41 所属栏目:安全 来源:网络整理
导读:我遇到了一个有点奇怪的BASH无限循环行为,其输出被流水线化到另一个进程.也就是说,我运行这两个命令: (while true; do echo xxx; done) | head -n 1(while true; do date; done) | head -n 1 第一个退出,而第二个不退出(我认为它将永远运行而不被杀死).我也
我遇到了一个有点奇怪的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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读