grep에서 "*.pl"과 *.pl의 차이점은 무엇입니까? 인용하면 결과가 바뀌는 이유는 무엇입니까?

grep에서 "*.pl"과 *.pl의 차이점은 무엇입니까? 인용하면 결과가 바뀌는 이유는 무엇입니까?

차이점이 뭐야:
grep "string" . -r --include *.pl

그리고

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

후자는 하위 디렉터리의 파일을 포함하지만 전자는 그렇지 않습니다. 왜?

답변1

(별표 *또는 별표)는 일반적으로 명령을 내리기 전에 쉘에서 해석되는 특수 문자입니다. (일반적으로) 앞에 점이 있는 파일 이름을 제외한 모든 파일 이름으로 확장됩니다. 보다패턴 일치에 대한 bash 매뉴얼더 많은 정보를 알고 싶습니다.

별표를 따옴표 안에 넣으면 쉘은 별표를 해석하지 않고 명령에 그대로 제공합니다.


예를 들어. 인용된 것 중 하나:

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

여기서는 매개변수가 포함된 grep옵션을 받게 됩니다. char로 시작하는 4자리 문자열입니다. 이 문자열의 기능은 전적으로 다음에 따라 달라집니다. 이 경우 glob과 일치하는 파일만 고려된다는 의미입니다.--include*.pl*grepgrep--include*.pl

내가 아는 한, gnu grep은 뒤에서 gnu bash와 동일한 패턴 일치 라이브러리를 사용합니다. 이는 표시된 것과 동일한 파일이 포함된다는 의미입니다 echo *.pl.

인용되지 않음:

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

*.pl여기서 쉘은 명령을 실행하기 전에 먼저 glob을 확장합니다. glob은 all로 확장됩니다 .pl.

파일 이 있다고 가정 하고 foo.pl. glob을 확장한 후 명령줄은 다음과 같습니다.bar.plbaz.pl

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

여기에는 매개변수가 있는 옵션이 수신되고 grep그 뒤에는 옵션이 수신됩니다.--includefoo.plbar.plbaz.pl

--include foo.pl패턴과 일치하는 파일만 고려하도록 grep에 지시합니다 foo.pl. 패턴에 와일드카드가 없으므로(별표 없음) 일치하는 파일은 foo.pl.

옵션 bar.plbaz.pl지침 grep도 이러한 파일에서 검색합니다. 하지만 패턴과 일치하지 않기 때문에 foo.pl이전 패턴을 기준으로 무시됩니다 --include.

답변2

차이점은 패턴( )을 인용하지 않으면 *.pl쉘에 의해 확장된다는 점입니다. 예를 들어, grep이름이 지정된 파일이 포함된 디렉터리에서 실행하는 경우 foo.pl해당 파일은 *pl셸에 의해 확장되므로 grep실제로 표시되는 내용은 다음과 같습니다.

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

해당 파일 만 포함하도록 지정했으므로 foo.pl해당 파일 하나만 검색합니다.

패턴을 인용하면 쉘은아니요그것을 확장하고 grep올바른 명령을 얻으십시오.

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

관련 정보