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
相关产品推荐
相关产品推荐

