为什么 ** 不能在 npm package.json 脚本中使用用于递归全局匹配,如果它在“npm shell”中工作?

问题描述

所以我在这里一个示例项目,其结构如下:

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)

解决方法

$ConnectionString = "server=" + $MySQLHost + ";port=$Mysqlport;uid=" + $Mysqluser + ";pwd=" + $Mysqlpass + ";database=" + $Database + ";allow zero datetime=true;" [void][System.Reflection.Assembly]::LoadWithPartialName("MySql.Data") $Connection = New-Object MySql.Data.MySqlClient.MySqlConnection $Connection.ConnectionString = $ConnectionString $Connection.Open() $Command = New-Object MySql.Data.MySqlClient.MySqlCommand($Query,$Connection) $command.CommandTimeout = 7200; $DataAdapter = New-Object MySql.Data.MySqlClient.MySqlDataAdapter($Command) $DataSet = New-Object System.Data.DataSet $RecordCount = $dataAdapter.FillAsync($dataSet,"data") $results = $DataSet.Tables[0] 环境变量是用户首选的交互式 shell。它通常不用于脚本,也不应该用于脚本,因为这是用户偏好,并且没有特殊原因说明用户偏好的 shell 会实现脚本语言。

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

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

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