grep 빼기 숫자가 작동하지 않습니다

grep 빼기 숫자가 작동하지 않습니다

가 포함된 디렉토리에서 모든 파일을 찾고 싶습니다 -2.

ls | grep "-2"반품 사용usage: grep...

큰따옴표 대신 작은따옴표를 사용하면 동일한 결과가 반환되고 따옴표를 전혀 사용하지 않아도 다른 항목을 검색하면 일치하는 파일 이름이 올바르게 반환됩니다.

내가 기억하는 것은 -정규식 특수 문자가 아닙니다.

이름이 있는 파일을 찾는 특정 문제에 집중하지 마십시오. 나는 주로 grep이 이런 식으로 동작하는 이유를 이해하고 싶습니다.

macOS 10.13에서 bash 사용

답변1

이는 따옴표로 묶인 사실에 관계없이 -2를 명령줄 매개변수로 해석하는 것과 같습니다.

grep 알지 못한다매개변수가 따옴표로 묶였는지 여부.

많은 구문 분석 단계는 아무것도 실행하기 전에 셸 자체에서 수행됩니다 1.> 즉, 리디렉션이 적용되고, $변수가 확장되고, *와일드카드가 확장되고, |파이프라인이 개별 명령 집합으로 분할되고, 각 명령이 단어 배열로 분할됩니다.

grep -2따라서 , grep '-2', grep \-2또는 심지어 를 실행하더라도 x=-2; grep $x셸은 이를 동일한 매개변수 목록({ grep, -2})으로 간주합니다. 이것이 execv() 시스템 호출에 전달될 내용이며,grepargv[]프로그램은 원래 인용에 관계없이 배열 로 수신됩니다 .


1 CreateProcess()의 명령줄이 단일 문자열인 Windows에서도 대부분의 포트는grepC 런타임 라이브러리가 초기화 중에 동일한 인수 분할을 수행하기 때문에 여전히 이 동작이 발생합니다.

관련 정보