#/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 | 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循环意外停止所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)