npm - 如果它在 'npm shell' 中有效,为什么不能在 npm package.json 脚本中使用(用于递归 globbing)?

标签 npm sh zsh glob npm-scripts

所以我这里有一个结构如下的示例项目:

wc-npm-test ❯ tree

├── dir0
│   ├── dir0-1
│   │   └── jsfile.js
│   └── jsfile.js
├── dir1
│   ├── dir1-1
│   │   └── jsfile.js
│   └── jsfile.js
├── jsfile.js
└── package.json

4 directories, 6 files

每个 jsfile.js 包含 3 行:

console.log("line");
console.log("line");
console.log("line");

在 package.json 我有两个脚本:

  "scripts": {
    "wc": "wc -l **/*.js",
    "shell": "echo $SHELL"
  },

现在,当我使用此命令将其直接输入终端时,我得到了如下结果:

wc-npm-test ❯ wc -l **/*.js    
       3 dir0/dir0-1/jsfile.js
       3 dir0/jsfile.js
       3 dir1/dir1-1/jsfile.js
       3 dir1/jsfile.js
       3 jsfile.js
      15 total

但是当我将它用作 npm 脚本时,它会给我这样的结果:

wc-npm-test ❯ npm run wc       

> wc-npm-test@1.0.0 wc
> wc -l **/*.js

       3 dir0/jsfile.js
       3 dir1/jsfile.js
       6 total

因此,当它由 npm 执行时,它只计算 dir0dir1 目录中的文件,将 **/*.js 解释为所有 1 个深度文件夹中的所有 .js文件。但是,当直接在终端中输入时,它会像往常一样被解释——从那一点开始的所有文件夹和文件。

谁能给我解释一下为什么会这样?

我的默认终端是 zsh。 Npm 使用相同的 shell,基于这些脚本:

wc-npm-test ❯ npm run shell

> wc-npm-test@1.0.0 shell
> echo $SHELL

/bin/zsh

wc-npm-test ❯ echo $SHELL
/bin/zsh

npm --version 7.5.2

节点 --version v14.15.0

zsh --version zsh 5.8 (x86_64-apple-darwin19.3.0)

最佳答案

SHELL 环境变量是用户首选的交互式 shell。它通常不用于脚本,也不应该用于脚本,因为这是用户的偏好,并且没有特别的理由说明为什么用户的首选 shell 会实现脚本的语言。

在脚本上下文中,在类 Unix 环境中,“shell”具体表示 sh ,也称为“POSIX shell”或 Bourne 风格的 shell。 POSIX sh 基于历史悠久的 Bourne shell,但有几个细微差别。 Bash(几乎)与 POSIX sh 兼容。 Zsh 与 POSIX sh 大致相似,但有一些不同之处。

通配符 **/ 递归遍历目录是 zsh 对 POSIX sh 的扩展。此扩展也出现在 bash 和 ksh 中,但默认情况下未启用。它不存在于其他流行的 sh 实现中,例如 dash。

在 sh 脚本中,要递归遍历目录,请使用 find 命令。

关于npm - 如果它在 'npm shell' 中有效,为什么不能在 npm package.json 脚本中使用(用于递归 globbing)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66357091/

相关文章:

javascript - 使用.nvm安装时如何选择节点版本

linux - linux shell netmask2cdir和cdir2netmask中cidr到netmask转换器的解释

zsh - HITIGNORE 在 zsh 中不起作用

访问我的主目录时 zsh 权限被拒绝

node.js - 永远从nodejs服务器开始

javascript - 如何修复 'npm run build'后的空白网页

javascript - Bundle.js 文件中的 Babel 输出未正确输出

linux - 从空格后开始的行中删除所有内容

python - 如何写一个 .sh 文件让我的 Linux 系统直接使用 ./hello 运行 python 文件

zsh - 如何在 ZSH 中编辑路径变量