node.js - npm 脚本忽略 grep 命令的参数

标签 node.js bash npm

我有一个方便的命令可以在我的文件中查找 TODO 注释。它可以直接从命令行(ubuntu)正常工作。

这是简单的 CLI 命令:

grep -lir --color --exclude-dir={node_modules,libs} --exclude=package.json 'todo'

这出现在 package.json 中

{
    "private": true,
    …
    "scripts": {
        "css:dev": "node tasks/postcss.js --mode development",
        "css:build": "node tasks/postcss.js --mode production",
        "js:dev": "webpack --mode development",
        "js:build": "webpack --mode production",
        "lint:css": "npx stylelint assets/css",
        "lint:js": "npx eslint assets/js",
        "images": "node tasks/images.js",
        "sprite": "node tasks/svgsprite.js",
        "todo": "grep -lir --color --exclude-dir={node_modules,libs} --exclude=package.json 'todo'"
    }
}

当使用npm或yarn运行时,它会忽略exlude参数并通过node_modules文件夹运行。

我不知道如何解决它。

最佳答案

原始命令行执行有效,因为 bash shell 扩展表达式 --exclude-dir={node_modules,libs}--exclude-dir=node_modules --exclude-dir=libs在调用grep之前。 grep很乐意多拿--exclude-dir参数,它将排除与任何指定名称匹配的目录。

package.json中命令的问题出现是因为 npm不使用bash运行命令。它使用普通的旧sh运行命令。

在某些系统上sh只是 bash 的另一个名称,并在这些系统上将原始命令放入 package.json将工作。想必艾哈迈德的系统就是其中之一。

但是,在其他系统上(特别是 Debian 及其后代)shbash相同。在这些系统上sh是一个更简单的 shell,并且它不会扩展 --exclude-dir={node_modules,libs}表达。所以grep看到未展开的参数并认为它被告知排除名称字面为 {node_modules,libs} 的目录。显然这不会产生您想要的结果。

有两种明显的方法可以解决这个问题。一是告诉npm告诉sh启动bash shell执行原始命令:

  "todo": "bash -c \"grep -lir --color --exclude-dir={node_modules,libs} --exclude=package.json 'todo'\""

另一个是我更喜欢的,因为它不涉及多层 shell 或嵌套/转义引号,是在命令中显式指定两个目录名称:

  "todo": "grep -lir --color --exclude-dir=node_modules --exclude-dir=libs --exclude=package.json 'todo'"

关于node.js - npm 脚本忽略 grep 命令的参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55341432/

相关文章:

node.js - 如何将数据库查询从模型传递到 Express.js 中的 Controller

linux - 在 linux bash 脚本中的 awk 中执行日期实用程序

javascript - 我应该接受来自dependabot 更新yarn.lock 的自动PR 吗?

ubuntu - 无法使用 npm 安装 history.js

arrays - bash 中的有序关联数组

npm - es2015模式下无法运行全局babel-node

javascript - 如何使用 Node.js 解压文件

mysql - Sequelize 可以处理与一个表关联的多个键吗?

javascript - Node , Mongoose 'findOne' 在一个集合上,在另一个集合的 'find' 内

java - 如何使用 bash 脚本将所有 jar 结果打印到文件中