linux – Bash while while循环意外停止

linux – Bash while while循环意外停止,第1张

概述我正在分析两个脚本,其中包含一些我不理解的行为: #/bin/bashtijd=${1-60}oud=`ls -l $MAIL`while : ; do nieuw=`ls -l $MAIL` echo $oud $nieuw sleep $tijddone | { read a b rest ; echo $a ; echo $b ; echo $rest ; } 此脚 我正在分析两个脚本,其中包含一些我不理解的行为:
#/bin/bashtijd=${1-60}oud=`ls -l $MAIL`while : ; do   nIEuw=`ls -l $MAIL`   echo $oud $nIEuw   sleep $tijddone | { read a b rest ; echo $a ; echo $b ; echo $rest ; }

此脚本中的while循环在一次迭代后停止.

#/bin/bashtijd=${1-60}oud=`ls -l $MAIL`while : ; do   nIEuw=`ls -l $MAIL`   echo $oud $nIEuw   sleep $tijddone | cat

此脚本中的while循环是无限的.

有什么不同?我认为它与管道和括号有关,但我无法解释它.

解决方法 由于调用SIGPIPE信号而导致管道后读取的循环在第一次迭代后终止,因为管道的LHS写入管道,其输出未被读取,因为在RHS上没有读取循环.以猫为例的例子不会退出,因为cat连续从输入读取,读取在读取一行后终止.

要了解此行为,请首先减少您的示例:

while : ; do pwd; done | { read -r line; echo $line; }/Users/admin

所以读取在第一行之后终止.要验证此启用pipefail使用:

set -o pipefail

并检查退出状态:

while : ; do pwd; done | { read -r line; echo "$line"; }echo $?141

存在状态141是由于SIGPIPE.

要解决这个问题,现在改变你对while循环中管道的RHS的读取:

while : ; do pwd; sleep 5; done | { while read -r line; do echo "$line"; done; }/Users/admin/Users/admin/Users/admin

现在你根本不会看到命令退出,因为read正在连续捕获来自LHS管道的所有数据.

总结

以上是内存溢出为你收集整理的linux – Bash while while循环意外停止全部内容,希望文章能够帮你解决linux – Bash while while循环意外停止所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/1049836.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-25
下一篇 2022-05-25

发表评论

登录后才能评论

评论列表(0条)

保存