Bash使用source导入函数脚本是否会引发command not found报错?
问题排查结论与解决方案
你的source导入方式没有问题,出现jq command not found错误和脚本导入逻辑无关,属于命令可访问性的环境问题,可按以下方向逐一排查:
- 确认jq是否已安装
大多数Linux发行版、macOS默认不预装jq,先在当前执行脚本的终端执行which jq,如果无输出说明没有安装,可通过对应包管理器安装:- Debian/Ubuntu系:
apt install jq - CentOS/RHEL系:
yum install jq - macOS:
brew install jq
- Debian/Ubuntu系:
- 排查PATH环境变量异常
如果确认jq已经安装,大概率是脚本运行时的PATH环境变量没有包含jq的安装路径:- 可以在script2.sh的两个
jq调用前都添加echo $PATH,对比两处输出的PATH是否一致,同时确认which jq返回的路径是否在PATH列表中 - 如果你遇到的是get函数内的第一次jq调用成功,dosomething内的第二次jq调用失败的情况,优先检查两次jq调用之间的代码是否修改了PATH变量,导致jq的安装路径被移除
- 可以在script2.sh的两个
- 特殊执行上下文的适配
如果你是通过crontab定时任务、sudo提权、服务托管等方式执行脚本,这类场景的默认PATH和普通交互终端的PATH不一致,即使你手动在终端能找到jq,脚本执行时也会报错,两种解决方案:- 调用jq时直接写绝对路径,比如你用
which jq查到路径是/usr/bin/jq,就把代码里的jq替换为/usr/bin/jq - 在脚本开头强制指定完整的PATH,示例:
export PATH=/usr/local/bin:/usr/bin:/bin:$PATH
- 调用jq时直接写绝对路径,比如你用
你可以先在script1.sh的source ./script2.sh前添加which jq测试,如果这一步就报错,完全可以确认和script2的导入逻辑无关,直接按上面的环境问题排查即可。
内容的提问来源于stack exchange,提问作者Pedro Gonzalez
相关产品推荐
相关产品推荐

