Bash调用HTTPie请求Strava API命令行正常,crontab执行报错
问题原因
- Crontab的运行环境和交互式终端环境不一致:Crontab默认的
PATH环境变量范围远小于用户登录后的PATH,优先调用了系统中其他同名的http工具(而非你安装的HTTPie),不同工具的参数格式不兼容,直接抛出参数无法识别的错误。 - 脚本未指定解释器:如果你的脚本头部没有加
#!/bin/bash声明,Crontab会默认用/bin/sh执行脚本,部分参数展开规则和bash不一致,也会导致参数传递异常。 - 低版本HTTPie的非交互兼容问题:部分旧版HTTPie在非交互式环境下会误判标准输入存在,打乱参数解析顺序。
解决方法
- 使用命令绝对路径
在正常执行脚本的终端中分别执行which http和which jq,获取两个命令的绝对路径,比如输出为/usr/local/bin/http和/usr/bin/jq,将脚本中的对应命令替换为绝对路径,同时添加HTTPie的--ignore-stdin参数避免stdin干扰:
access_token=$(/usr/local/bin/http --ignore-stdin POST "https://www.strava.com/oauth/token" client_id="xxx" client_secret="xxx" refresh_token="xxx" grant_type="refresh_token" | /usr/bin/jq -r '.access_token')
- 指定脚本解释器
在脚本的第一行添加bash声明:
#!/bin/bash
- 统一Crontab的PATH变量(可选)
如果不想修改脚本内的命令路径,可以在Crontab配置的最顶部添加PATH声明,先在终端执行echo $PATH获取你当前环境的完整PATH值,然后写入crontab:
PATH="替换为你执行echo $PATH拿到的完整输出" # 下面再写你原来的crontab任务
修改完成后先手动执行bash strava.sh确认功能正常,再触发crontab任务验证即可。
内容的提问来源于stack exchange,提问作者rápido_pingüino
相关产品推荐
相关产品推荐

