我知道通配符在运行命令之前由 shell 扩展,它们是 shell 的一个特性。通配符也适用于那些可以接受许多参数的命令。如果我们在find . -name *.rb
当前目录中有多个文件find
会给我们一个错误,因为 find 不能接受多个参数,解决这个问题的方法是:
find . -name "*.rb"
find . -name '*.rb'
find . -name \*.rb
我们避开星号并防止 shell 扩展,但通配符是 shell 的一个特性;当我们转义星号时,shell 不知道它的含义,它应该找到一个名为 的文件*.rb
,那么在这种情况下星号是如何扩展的呢?
是的,shell 理解
*
为目录中具有任何字符的*.rb
所有文件以及具有任何字符和结尾的所有文件.rb
,并将其扩展为这样。find
命令本身接受通配符。如果你不引用,
*
那么 shell 将在命令看到它的参数之前将其展开,因此find
不是传递给的 glob,而是*.rb
将find
目录中与 glob 匹配的所有文件的名称传递给find
,并find
尝试解释它们作为参数,这可能会导致错误,或者至少不是您想要的(仅当当前目录中没有匹配的文件时它才能正常工作)