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

使用curl格式输出时,如何判断curl请求是否失败

解决Curl请求失败仍输出耗时的问题

首先得明确:你用的-f参数是关键——它会让Curl在返回HTTP 4xx/5xx状态码(比如文件不存在的404)时,返回非0的退出码,这是判断请求是否成功(是否下载到文件)最可靠的依据,比看输出内容准确得多。

现在问题是不管成功失败,-w指定的耗时格式都会输出,我们需要把耗时输出和成功状态绑定,只在成功时展示耗时信息。

具体解决方案

方案1:用临时文件控制耗时输出

通过临时文件存储耗时数据,只有当Curl执行成功时才读取并打印:

# 定义你的变量
IP_PORT="your-server-ip:port"
FILE_NAME="target-file.txt"
FORMAT_FILE="curl-format.txt"

# 创建临时文件存储耗时日志
temp_time_log=$(mktemp)

# 执行Curl命令,把耗时输出写入临时文件
curl -f -H 'Cache-Control: no-cache' -w "@$FORMAT_FILE" -o /dev/null -s "$IP_PORT/$FILE_NAME" > "$temp_time_log"

# 获取Curl的退出码
exit_code=$?

# 根据退出码判断结果
if [ $exit_code -eq 0 ]; then
    echo "✅ 文件下载成功,耗时信息:"
    cat "$temp_time_log"
else
    echo "❌ 请求失败(目标文件不存在或服务器错误),退出码:$exit_code"
    # 若需要查看失败时的耗时,取消下面注释
    # echo "失败时的耗时信息:"
    # cat "$temp_time_log"
fi

# 清理临时文件
rm "$temp_time_log"

方案2:精准判断“文件不存在”场景

如果想更精准区分是「文件不存在(404)」还是其他服务器错误,可以修改curl-format.txt加入HTTP状态码,再解析判断:

  1. 更新curl-format.txt,添加状态码行:
    time_namelookup: %{time_namelookup}
    time_connect: %{time_connect}
    time_appconnect: %{time_appconnect}
    http_code: %{http_code}
    
  2. 修改脚本逻辑:
    # 前面步骤同方案1...
    
    if [ $exit_code -eq 0 ]; then
        echo "✅ 文件下载成功,耗时信息:"
        cat "$temp_time_log"
    else
        # 提取HTTP状态码
        http_code=$(grep -oP 'http_code: \K\d+' "$temp_time_log")
        if [ "$http_code" -eq 404 ]; then
            echo "❌ 目标文件不存在(HTTP 404)"
        else
            echo "❌ 服务器返回错误状态码:$http_code"
        fi
    fi
    

核心逻辑总结

  • 用-f参数让Curl把HTTP错误转化为非0退出码,这是判断请求成败的核心依据
  • 通过shell条件判断+临时文件,实现“仅成功时输出耗时”的需求
  • 额外结合%{http_code}变量,可以精准定位「文件不存在」这类特定失败场景

内容的提问来源于stack exchange,提问作者nmnir

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 10:31:31