通配符是 shell 的一个特性吗?

Sin*_*osh 12 bash find wildcards

我读了很多的问题和答案像这个这个

我知道通配符在运行命令之前被 shell 扩展,它们是 shell 的一个特性。通配符也适用于那些可以接受许多参数的命令。在find . -name *.rb 我们若在当前目录多个文件find会给我们一个错误,因为发现不能接受多个参数,解决这个是方法:

find . -name "*.rb"
find . -name '*.rb'
find . -name \*.rb
Run Code Online (Sandbox Code Playgroud)

我们避开星号并防止 shell 扩展,但通配符是 shell 的一个特性;当我们转义 asterisk shell 不知道它的含义时,它应该找到一个名为 的文件*.rb,那么在这种情况下星号是如何扩展的?

Zan*_*nna 22

是的,shell 理解*为目录中包含任何字符的*.rb所有文件以及包含任何字符和结尾的所有文件.rb,并将其扩展为这样。

find命令本身接受通配符。

如果您不引用 ,*则 shell 将在命令看到其参数之前展开它find,因此不是*.rb传递给glob,而是find将目录中与 glob 匹配的所有文件的名称传递给find,并find尝试解释它们作为参数,这可能会导致错误,或者至少不是您想要的(只有当当前目录中没有匹配的文件时,它才会正常工作)

  • @Sinoosh:请注意,并非所有命令都理解 glob 语法。它恰好是`find`的一个特性 (7认同)
  • 如果引用了 `*`,那么 shell 将不会扩展它,并且包含 glob 的参数被传递给可以理解 glob 的命令 - 对于任何接受 regex 的命令都是一样的,它应该总是被引用.. . (5认同)