나는 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
의지할 만한 가치가 없는 것일 수도 있습니다. 이와 같은 테스트 실행과 소스 코드를 사용하여 현재 버전의 동작을 이해할 수 있더라도 이 동작은 현재 문서와 일치하지 않기 때문에 나중에 변경될 수 있습니다. 어떻게 생각하나요?
(덧붙여서,최신 커밋에서 테스트-L
2가 아닌 종료 코드(in )와 (in ) in-eq-out-infloop
과 같은 극단적인 경우 외에는 테스트가 없는 것 같습니다. )-f /dev/null
skip-read
답변1
이것은실수,이것은GNU 3.4 grep
에서 수정됨:
표준 출력이 /dev/null일 때 "grep -L"의 종료 상태가 더 이상 올바르지 않습니다.
[Grep 3.2에 도입된 버그#37716]