如何检测while read -t TIMEOUT循环是否因超时退出?
检测
while read -t循环的退出原因 在bash环境中,read -t TIMEOUT命令的退出状态码可以直接区分循环退出的原因:
- 状态码
0:成功读取到输入内容 - 状态码
1:到达输入流末尾(EOF) - 状态码
124:超时未读取到任何输入
基于这个特性,我们可以在循环结束后通过检查$?(保存最后一次read的退出状态)来判断退出原因。
修改后的示例代码
#!/bin/bash { echo # 第一行 sleep 2 echo # 最后一行 } | { while read -t 1; do :; done case $? in 1) echo "到达文件末尾,正常退出" ;; 124) echo "超时退出" ;; *) echo "其他错误(状态码:$?)" ;; esac }
兼容POSIX Shell的替代方案
如果需要在不依赖bash特定状态码的POSIX兼容shell中实现,可以通过变量标记来区分:
#!/bin/sh { echo # 第一行 sleep 2 echo # 最后一行 } | { has_input=0 while read -t 1; do has_input=1 : # 这里处理读取到的内容 done # 如果最后一次read失败且之前没有读取到任何输入,说明是超时;否则是EOF if [ $? -ne 0 ] && [ $has_input -eq 0 ]; then echo "超时退出" else echo "到达文件末尾退出" fi }
注:此方案依赖shell支持read -t选项,部分老旧POSIX shell可能不支持该参数。
内容的提问来源于stack exchange,提问作者Fravadona
相关产品推荐
相关产品推荐

