linux – Bash while while循环意外停止
发布时间:2020-12-31 10:56:52 所属栏目:Linux 来源:网络整理
导读:我正在分析两个脚本,其中包含一些我不理解的行为: #/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/bash tijd=${1-60} oud=`ls -l $MAIL` while : ; do nieuw=`ls -l $MAIL` echo $oud $nieuw sleep $tijd done | { read a b rest ; echo $a ; echo $b ; echo $rest ; } 此脚本中的while循环在一次迭代后停止. #/bin/bash tijd=${1-60} oud=`ls -l $MAIL` while : ; do nieuw=`ls -l $MAIL` echo $oud $nieuw sleep $tijd done | 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管道的所有数据. (编辑:常州站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- rsync+inotify实现实时同步案例--转
- 手机qq语音彩铃在哪设置 手机qq语音个性彩铃设置方法
- CentOS 替代方案AlmaLinux 构建系统向全部人开放
- 如何在Python中打开命名的pipecharacter设备专用文件进行读
- 魅族mx2支持nfc吗 有nfc功能吗
- httpd: apr_sockaddr_info_get() failed for bogon
- linux – 使用1024以下端口的普通用户
- linux – 如何同时设置niceness和process affinity?
- 为什么Linux内核一直用Unsigned Long来取代指针
- 12306购票验证码认不出来怎么办 12306奇葩验证码解决办法教