차이점이 뭐야:
grep "string" . -r --include *.pl
그리고
grep "string" . -r --include "*.pl"
후자는 하위 디렉터리의 파일을 포함하지만 전자는 그렇지 않습니다. 왜?
답변1
(별표 *
또는 별표)는 일반적으로 명령을 내리기 전에 쉘에서 해석되는 특수 문자입니다. (일반적으로) 앞에 점이 있는 파일 이름을 제외한 모든 파일 이름으로 확장됩니다. 보다패턴 일치에 대한 bash 매뉴얼더 많은 정보를 알고 싶습니다.
별표를 따옴표 안에 넣으면 쉘은 별표를 해석하지 않고 명령에 그대로 제공합니다.
예를 들어. 인용된 것 중 하나:
grep "string" . -r --include "*.pl"
여기서는 매개변수가 포함된 grep
옵션을 받게 됩니다. char로 시작하는 4자리 문자열입니다. 이 문자열의 기능은 전적으로 다음에 따라 달라집니다. 이 경우 glob과 일치하는 파일만 고려된다는 의미입니다.--include
*.pl
*
grep
grep
--include
*.pl
내가 아는 한, gnu grep은 뒤에서 gnu bash와 동일한 패턴 일치 라이브러리를 사용합니다. 이는 표시된 것과 동일한 파일이 포함된다는 의미입니다 echo *.pl
.
인용되지 않음:
grep "string" . -r --include *.pl
*.pl
여기서 쉘은 명령을 실행하기 전에 먼저 glob을 확장합니다. glob은 all로 확장됩니다 .pl
.
파일 이 있다고 가정 하고 foo.pl
. glob을 확장한 후 명령줄은 다음과 같습니다.bar.pl
baz.pl
grep "string" . -r --include foo.pl bar.pl baz.pl
여기에는 매개변수가 있는 옵션이 수신되고 grep
그 뒤에는 옵션이 수신됩니다.--include
foo.pl
bar.pl
baz.pl
--include foo.pl
패턴과 일치하는 파일만 고려하도록 grep에 지시합니다 foo.pl
. 패턴에 와일드카드가 없으므로(별표 없음) 일치하는 파일은 foo.pl
.
옵션 bar.pl
및 baz.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