"ls | grep zip" 대 "grep zip $(ls)"

"ls | grep zip" 대 "grep zip $(ls)"

확장/명령 대체에 대해 배우고 있는데 예제를 살펴보면서 이 두 명령의 결과가 다르다는 것을 알았습니다.

예를 들어, cd into /usr/bin, run 을 실행 하면 ls | grep zipgrep은 파일 이름에서만 "zip"을 선택합니다.

grep zip $(ls)그러나 동일한 디렉토리에서 실행하면 grep은 파일 내용에서 zip도 선택합니다. 왜? 우분투 16.04.

초보자 질문이라는 것을 알고 있지만 이유를 아는 것이 여전히 도움이 될 것입니다. 감사해요.

답변1

이는 grep두 가지 별개의 모드로 작동할 수 있기 때문입니다.

DESCRIPTION
   grep searches the named input FILEs for lines containing a match to the
   given PATTERN.  If no files are specified, or if the file “-” is given,
   grep  searches  standard  input.   By default, grep prints the matching
   lines.

에서 명령 ls | grep zipgrep표준 입력의 파일 이름 목록을 보고 검색합니다.

에서 grep zip $(ls)쉘은 ls명령의 결과를 파일 이름 인수로 처리하는 목록 단어로 대체 grep하고 각 단어를 차례로 검색하여 패턴을 찾습니다 zip.

중요 참고 사항: 파일 이름에 공백이 포함된 경우 공백으로 구분된 부분은 별도의 인수로 처리되어 No such file or directory 오류.일치하는 파일을 검색하는 더 안전한 방법은 쉘 글로브를 사용하는 것입니다.grep 'pattern' *zip*

관련 정보