这在外壳中有效:
grep -R --exclude-dir=storage --exclude-dir=node-modules --include=*.{scss,css} loader.gif
但这失败了:
sh -c "grep -R --exclude-dir=storage --exclude-dir=node-modules --include=*.{scss,css} loader.gif"
它失败了,没有任何消息,它只是找不到任何发生的情况。
这有效:
sh -c "grep -R --exclude-dir=storage --exclude-dir=node-modules --include=*.scss loader.gif"
为什么使用花括号会--include=*.{scss,css}
失败?
答案1
可能是因为您sh
是普通的 POSIX sh (或者至少比您的登录 shell 更简单),并且不支持大括号扩展。对于 Linux 系统,至少 Debian 和 Debian 都是默认情况乌班图。如果您想运行 Bash,请运行bash -c
。
答案2
因为“扩张时间”。
让我们简化一下命令:
$ echo --include=*.{scss,css}
--include=*.scss --include=*.css
正如您所看到的,大括号是由“当前运行的 shell”(可能是 bash)扩展的。并且未展开,因为当前目录中*
可能没有名称以(或) 开头--include=
且结尾的文件。.scss
.css
然而,在:
$ sh -c "echo --include=*.{scss,css}"
--include=*.{scss,css}
发生两件事:
当前正在运行的 shell (PRS) 不会展开大括号,因为它们被引用并按字面意思提供给下一个 shell
sh -c
。下一个 shell 不支持大括号扩展,因此保持原样。用 echo 打印它们。
因此,要么让 PRS 展开大括号:
sh -c 'echo "$@"' mysh --include=\*.{scss,css}
这很复杂,不是推荐的解决方案。或者,使用支持大括号的 shell:
bash -c 'echo --include=\*.{scss,css}'
两者都*
被引用以防止其扩展。