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

Bash脚本date时间计算异常及curl输出问题求助

问题排查与解决

1. 接口JSON被意外打印的原因

curl默认会将服务器响应内容输出到标准输出(stdout),所以你会看到接口返回的JSON。解决方法:

  • 若不需要保留响应内容,将输出重定向到/dev/null:
    curl -o /dev/null --location --request GET 'http://your-api-url'
    
  • 若需要保留响应,可指定输出文件:
    curl -o response.json --location --request GET 'http://your-api-url'
    
  • 同时隐藏curl的进度信息,可加上-s(静默模式):
    curl -s -o /dev/null --location --request GET 'http://your-api-url'
    

2. endTime为0、耗时计算为0的原因及排查

date +%s正常情况下不可能返回0,出现这种情况说明endTime=$(date +%s)这条命令根本没被执行,脚本在curl命令之后就终止了,常见原因如下:

原因1:脚本启用了set -e模式

若脚本中(或调用脚本时的环境中)设置了set -e,当curl命令返回非0退出码(比如请求失败、网络错误、接口返回4xx/5xx状态码)时,脚本会直接终止,后续命令不再执行。

  • 排查:在脚本开头添加echo "当前shell选项: $-",若输出包含字母e,说明启用了set -e。
  • 解决:
    • 若不需要set -e,可在脚本开头添加set +e关闭该模式;
    • 或者让curl命令失败后不终止脚本,在curl后加|| true:
      curl -s -o /dev/null --location --request GET 'http://your-api-url' || true
      

原因2:curl命令收到致命信号终止脚本

比如curl请求过程中被强制杀死、遭遇严重网络错误导致进程崩溃,这种情况会直接终止整个脚本。

  • 排查:在curl命令后添加echo "curl退出码: $?",执行脚本后查看退出码:
    • 若退出码为128及以上,说明curl收到信号终止;
    • 其他非0值说明curl请求本身失败(如无法连接主机、权限问题等)。

额外优化:耗时计算的更优写法

用Bash内置的算术扩展替代expr,更简洁高效:

callDuration=$((endTime - startTime))

修正后的完整脚本示例

#!/bin/bash
# 关闭set -e(如果不需要的话)
set +e

startTime=$(date +%s)
# 丢弃响应内容并静默执行curl,失败后不终止脚本
curl -s -o /dev/null --location --request GET 'http://your-api-url' || true
endTime=$(date +%s)

# 输出curl退出码用于排查
echo "curl退出状态: $?"

# 计算并输出耗时
callDuration=$((endTime - startTime))
echo "开始时间戳: $startTime"
echo "结束时间戳: $endTime"
echo "请求耗时(秒): $callDuration"

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 18:05:25