Unix 명령이 셸에서 0이 아닌 값으로 종료되고 bash if 조건에서 사용될 때 True로 평가되는 이유는 무엇입니까?

Unix 명령이 셸에서 0이 아닌 값으로 종료되고 bash if 조건에서 사용될 때 True로 평가되는 이유는 무엇입니까?

명령은 patch -R -p0 -s -f --dry-run < abc.patch종료 코드 1로 실패하고 패치 명령의 오류 메시지를 인쇄하지만 if 조건에서 부정과 함께 사용하면 통과(예: Pass 인쇄)하는 경우 아래 코드는 다음과 같습니다.

if ! patch -R -p0 -s -f --dry-run < abc.patch; then
         echo "Pass"
fi

나는 무엇을 시도했는가? dev/null 문자열을 리디렉션했는데 결과가 변경되지 않았습니다.

여기서 무엇이 잘못되었는지 이해하도록 도와주세요.

답변1

patchfor 문의 종료 상태를 부정했기 때문에 if해당 문은 " 실패하면 문자열을 출력합니다 " if로 읽을 수 있습니다 .patchPass

if명령문은 주어진 명령이 성공했는지 테스트합니다(진짜) 또는 실패(잘못된). 원한다면 이것을 기억하고 이 답변의 나머지 부분은 잊어도 됩니다.

명령이 실패하면 종료 상태가 0이 아니므로 실패 원인을 자세히 조사할 수 있습니다. 유틸리티가 반환된 실제 값에 대한 의미를 지정하는 경우(예: 설명서의 마지막 섹션 curl참조 rsync) 스크립트는 오류를 적절하게 처리하도록 선택할 수 있습니다.

명령의 종료 상태가 0이면 유틸리티가 성공적으로 완료되었음을 쉘에 알립니다.

종료 상태는 "부울" 또는 "참 또는 거짓"보다는 "오류 코드"에 가깝습니다. true/false 부울 테스트는 if유틸리티에 오류 조건이 있는지 확인하기 위해 종료 상태를 테스트하는 명령문에 의해 내부적으로 수행됩니다. 그렇지 않은 경우(종료 상태가 0) 테스트는 다음과 같습니다.진짜즉, 유틸리티가 실패하지 않았습니다.

답변2

)X가 틀리지 않는 한 분명히 말하고 싶을 것입니다(@their 답변 참조). 이는 종료 코드와는 아무런 관련이 없으며 단지 부정의 복잡성만 있을 뿐입니다.

관련 정보