grep中的“*.pl”和*.pl有什么区别?为什么引用会改变结果?

grep中的“*.pl”和*.pl有什么区别?为什么引用会改变结果?

有什么区别:
grep "string" . -r --include *.pl

grep "string" . -r --include "*.pl"

后者包含子目录中的文件,而前者则不包含。为什么?

答案1

(星*号或星号)是一个特殊字符,通常由 shell 在给出命令之前对其进行解释。它(通常)扩展到所有文件名,除了带有前导点的文件名。请参阅关于模式匹配的 bash 手册了解更多信息。

如果将星号放在引号中,则 shell 不会解释该星号,而是将其逐字提供给命令。


举例说明。引用的一位:

grep "string" . -r --include "*.pl"

这里将收到带有参数的grep选项。这是一个以 字符 开头的 4 个字符的字符串。该字符串的作用完全取决于.在这种情况下意味着仅考虑与 glob 匹配的文件。--include*.pl*grepgrep--include*.pl

据我所知,gnu grep 在幕后使用与 gnu bash 相同的模式匹配库。这意味着它将包含与 所示相同的文件echo *.pl

未引用的:

grep "string" . -r --include *.pl

*.pl这里,shell在执行命令之前将首先展开 glob 。 glob 将扩展到所有以.pl.

假设有文件foo.plbar.plbaz.pl。展开 glob 后,命令行如下所示:

grep "string" . -r --include foo.pl bar.pl baz.pl

这里将接收带有参数的grep选项,后跟选项和。--includefoo.plbar.plbaz.pl

--include foo.pl指示 grep 仅考虑与模式匹配的文件foo.pl。由于模式中没有通配符(没有星号),唯一匹配的文件将是名为foo.pl.

选项bar.plbaz.pl指示 grep 也在这些文件中搜索。但由于它们与模式不匹配,因此foo.pl它们将根据前一个的要求被忽略--include

答案2

不同之处在于,如果您不引用模式 ( *.pl),它会被 shell 扩展。例如,如果您grep在包含名为 的文件的目录中运行foo.pl,由于 是*pl由 shell 展开的,因此grep实际看到的是:

grep "string" . -r --include foo.pl

由于您告诉它仅包含foo.pl它,因此它只会搜索该一个文件。

如果你引用你的模式,shell 会不是展开它并grep得到正确的命令,即

 grep "string" . -r --include *pl

相关内容