You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何检测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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 02:31:04