Linux

何時以及為什麼需要引用星號

  • June 6, 2017

我認為我從來沒有完全理解過何時以及為什麼需要在 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參數只返回一次命中,而雙引號返回預期的兩次命中?

這取決於何時評估擴展。如果你不引用星號,bash 首先評估它。相當於呼叫find . -name main.opp. 如果您引用星號,它將按原樣傳遞,以查找哪個以您期望的方式使用它。

如果沒有引號,如果目前目錄中有任何匹配的文件,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

引用自:https://unix.stackexchange.com/questions/369419