使用循环执行多个yarn脚本时提示command not found错误如何解决
shell脚本循环执行yarn命令报错问题排查与解决
错误原因
你将包含空格的完整命令作为单个字符串存入数组后,直接执行$script时,zsh默认不会对变量值做单词拆分,会把整个yarn format字符串当成一个独立的命令名去系统路径中查找,自然找不到对应的可执行文件,所以抛出command not found错误,退出状态码127就是代表命令未找到。
解决方案
方案1:开启变量单词拆分(最小改动适配现有代码)
zsh中可以通过给变量加=标记强制开启单词拆分,仅需修改循环内的执行语句即可:
for script in "${scripts[@]}" do printf '\n=========> %s <=========\n' "$script" ${=script} done
方案2:使用eval执行(兼容bash/zsh多环境)
如果你需要脚本同时兼容bash环境,可以用eval执行字符串命令:
for script in "${scripts[@]}" do printf '\n=========> %s <=========\n' "$script" eval "$script" done
注意:如果命令内容包含不可控的外部输入,eval存在代码注入风险,当前你所有命令都是硬编码的固定值,可以放心使用。
方案3:使用二维数组存储命令(最规范写法)
如果后续需要支持带特殊字符、空格的复杂参数,更推荐直接用二维数组存储命令和参数,从根源避免拆分问题:
#!/bin/zsh # 每个子数组对应一条命令,第一个元素为命令,后续元素为参数 scripts=( (yarn format) (yarn test:cov) (yarn test:inte) (yarn test:e2e) (yarn build) ) for script in "${scripts[@]}" do printf '\n=========> %s <=========\n' "${script[*]}" "${script[@]}" done
内容的提问来源于stack exchange,提问作者A Mehmeto
相关产品推荐
相关产品推荐

