나는 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