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