我有方便的命令可以在文件中查找待办事项。直接从命令行(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文件夹。
我不知道如何解决它。
答案 0 :(得分:3)
原始命令行执行有效,因为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及其子代)上,sh
与bash
并不相同。在这些系统上,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'"