我认为我从未完全理解过在 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