왜 'grep -L x <</dev/null`은 `grep -L x <<인 경우에도 0을 반환합니다.

왜 'grep -L x <</dev/null`은 `grep -L x <<인 경우에도 0을 반환합니다.

나는 GNU grep 3.3-1(Debian Buster의 현재 버전).

에서 man grep:

종료 상태

일반적으로 종료 상태는 행이 선택된 경우 0, 행이 선택되지 않은 경우 1, 오류가 발생한 경우 2입니다. 그러나 -q또는 를 사용하여 행을 선택하면 --quiet오류 --silent가 발생하더라도 종료 상태는 0입니다.

이는 다음과 관련이 있습니다.POSIX. ( -L여기서는 지정하지 않았습니다.)

최신 버전에 대한 전체 문서그리고최신 커밋의 문서-L( )에 대한 --files-without-match자세한 내용은 없습니다 .

grep -L x <<<x(in bash) 코드 1로 종료합니다. 이것이 문서와 일치하는지 확실하지 않지만(여기서 선택한 줄이 정확히 무엇입니까?) 적어도 설명 가능합니다. 입력 파일이 없고 x.

grep -Lq x <<<x그리고 grep -L x <<<x >/dev/null둘 다 코드 0으로 종료됩니다. 좋아, -q이해하기가 조금 더 쉽지만 stdout 리디렉션이 종료 코드에 영향을 미치는 이유는 무엇입니까? 따라서 출력을 억제하면서 원래 종료 코드 동작을 얻으려면 (set -o pipefail; /bin/grep -L x <<<x | cat >/dev/null)유사한 해킹이 필요합니다 . 왜 그런 겁니까?

GNU grep은 매우 널리 사용되기 때문에 이것이 버그인지는 확실하지 않습니다 grep. 뭔가 빠졌을 가능성이 더 높습니다. 아니면 종료 코드가 -L의지할 만한 가치가 없는 것일 수도 있습니다. 이와 같은 테스트 실행과 소스 코드를 사용하여 현재 버전의 동작을 이해할 수 있더라도 이 동작은 현재 문서와 일치하지 않기 때문에 나중에 변경될 수 있습니다. 어떻게 생각하나요?

(덧붙여서,최신 커밋에서 테스트-L2가 아닌 종료 코드(in )와 (in ) in-eq-out-infloop과 같은 극단적인 경우 외에는 테스트가 없는 것 같습니다. )-f /dev/nullskip-read

답변1

이것은실수,이것은GNU 3.4 grep에서 수정됨:

표준 출력이 /dev/null일 때 "grep -L"의 종료 상태가 더 이상 올바르지 않습니다.

[Grep 3.2에 도입된 버그#37716]

이것은 관련 커밋입니다.

관련 정보