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

为何相同通配符在shell与npm脚本中的执行表现存在差异?

通配符表现不一致的原因

你在终端直接执行命令时用的shell(通常是Bash、Zsh)默认开启了globstar选项,此时**会递归匹配所有层级的子目录。而npm run执行脚本时默认调用的是sh shell,绝大多数系统的sh默认关闭globstar,此时**只会匹配一级子目录,就出现了你遇到的差异。

正确的写法(按兼容性优先级推荐)

  • 最稳妥的全环境兼容方案:用find命令实现全层级匹配,不需要依赖shell的glob配置,适配所有shell环境:
    修改npm脚本如下即可:
    {
      "scripts": {
        "test": "find ./src -type f -name \"*.js\""
      }
    }
    
    该写法可以正确匹配./src下所有层级的.js文件,包括直接放在src根目录的js文件。
  • 如果你不想更换命令只想调整glob写法:
    可以在脚本中先开启globstar再执行原有命令,同时如果需要覆盖src根目录下的js文件,可以用{,**/}语法同时匹配根目录和子目录:
    {
      "scripts": {
        "test": "shopt -s globstar && ls ./src/{,**/}*.js"
      }
    }
    
  • 如果你是给原生支持glob语法的工具(比如eslint、prettier)传路径:
    把通配符用单引号包裹,避免shell提前解析通配符,交给工具自己处理glob逻辑即可:
    {
      "scripts": {
        "lint": "eslint './src/**/*.js'"
      }
    }
    

内容的提问来源于stack exchange,提问作者wxttt

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 07:36:03