grep에서 "* .pl"과 * .pl의 차이점은 무엇입니까? 인용이 결과를 변경하는 이유는 무엇입니까?


10

차이점은 무엇입니까?
grep "string" . -r --include *.pl

grep "string" . -r --include "*.pl"

후자는 하위 디렉토리에있는 파일을 포함하지만 전자는 포함하지 않습니다. 왜?


차이점은 없습니다 grep. 껍질 안에 있습니다. grep따옴표를 보지 못합니다.
와일드 카드

답변:


17

*(별표 또는 별표)는이 명령을 주어지기 전에 (보통) 쉘에 의해 해석되는 특수 문자입니다. 점이있는 파일 이름을 제외한 모든 파일 이름으로 확장됩니다 (보통). 자세한 정보 는 패턴 일치에 대한 bash 매뉴얼 을 참조하십시오.

따옴표로 묶으면 별은 셸에서 해석되지 않으며 명령에 그대로 적용됩니다.


예는 설명했다. 인용 된 것 :

grep "string" . -r --include "*.pl"

여기 에 인수가 grep있는 옵션이 제공됩니다 . 첫 번째 문자 가 문자 인 4 개의 문자열입니다 . 무엇 해당 문자열과 함께하는 일은 전적으로 최대입니다 . 이 경우 패턴과 일치하는 파일 만 고려합니다 .--include*.pl*grepgrep--include*.pl

무대 뒤에서 AFAIK gnu grep은 gnu bash와 동일한 패턴 일치 lib를 사용합니다.

인용되지 않은 것 :

grep "string" . -r --include *.pl

여기서 쉘은 먼저로 *.pl끝나는 모든 파일 이름으로 패턴 을 확장합니다 .pl. 파일이있는 가정 foo.pl, bar.pl그리고 baz.pl. 명령 행을 확장 한 후 다음과 같습니다.

grep "string" . -r --include foo.pl bar.pl baz.pl

여기에 grep옵션 받게됩니다 --include인수와 foo.pl옵션 다음에 bar.plbaz.pl. --include foo.pl패턴과 일치하는 파일 만 고려한다는 의미입니다 foo.pl. 패턴에 와일드 카드가 없으므로 이름이 일치하는 파일과 일치하는 유일한 파일 foo.pl입니다.

옵션 bar.plbaz.pl수단 grep도 해당 파일에서 검색하지만 패턴과 일치하지 않으므로 foo.pl무시됩니다.


이것은 훌륭한 관찰입니다. 나는 왜 왜 grep -r일관성이없는 것 같았 는가를 알고 있었지만, 내가 *.
j883376

6

차이점은 패턴 ( *.pl)을 인용하지 않으면 셸에 의해 확장된다는 것입니다. 예를 들어, grep이라는 파일이 포함 된 디렉토리 에서을 실행 하면 셸이 확장 foo.pl되므로 실제로 보이는 것은 다음과 같습니다.*plgrep

grep "string" . -r --include foo.pl

포함하도록 지시하기 때문에 foo.pl하나의 파일 만 검색합니다.

패턴을 인용하면 쉘은 패턴을 확장 하지 않고grep 올바른 명령, 즉

 grep "string" . -r --include *pl

peopl에 의해 확장되지 않습니다 *.pl.
unxnut

@unxnut 좋은 지적, 답변 편집.
terdon
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.