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

使用循环执行多个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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.11 22:33:00