为什么带大括号的 grep --include 在子 shell 中失败?

为什么带大括号的 grep --include 在子 shell 中失败?

这在外壳中有效:

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}'

两者都*被引用以防止其扩展。

相关内容