我何时以及为什么需要引用星号

我何时以及为什么需要引用星号

我认为我从未完全理解过在 Linux/Bash 中何时以及为什么需要双引号的规则(我不确定这个问题的领域是 Linux、Bash 还是其他)。我认为*匹配任意数量的字符(包括没有),这似乎与维基百科的文章。但是当我尝试*按如下方式使用通配符时,我得到了我不明白的结果:

>pwd
/home/user/foo/foo/test
>tree 
.
├─ main.opp
└─ test
   └─ test.opp

>find ../ -name *.opp
../test/test.opp

>find ../ -name "*.opp"
../main.opp
../test/test.opp

>cd ..
>pwd
/home/user/foo/foo

>find . -name *.opp
./main.opp

>find . -name "*.opp"
./main.opp
./test/test.opp

为什么find使用非双引号*.opp参数仅返回一次命中,而双引号相同则返回预期的两次命中?

答案1

这取决于何时评估扩展。如果您不引用星号,bash 将首先对其求值。相当于调用find . -name main.opp.如果您引用星号,它将按原样传递以查找哪个按您期望的方式使用它。

答案2

如果没有引号,如果当前目录中有任何匹配的文件,bash 将扩展星号。这里我用来echo调试扩展。

~/foo/foo/test$ echo find ../ -name *.oop
find ../ -name test.oop
~/foo/foo/test$ cd ..
~/foo/foo$ echo find . -name *.oop
find . -name main.oop

如果您搜索的内容确实如此不给予匹配在当前目录下,不会展开:

~/foo/foo$ echo find . -name test.*
find . -name test.*
~/foo/foo$ find . -name test.*
./test/test.oop

相关内容