问题描述
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 执行时,它只计算 dir0 和 dir1 目录中的文件,将 **/*.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 脚本中,要递归遍历目录,请使用 **/
命令。