여기에는 두 가지 관련 문제가 있습니다.
첫째, OP의 질문, 왜 0은 참이지만 거짓은 쉘에서 1입니까? 둘째, 응용 프로그램이 성공하면 0을 반환하고 실패하면 0이 아닌 이유는 무엇입니까?
OP의 질문에 답하려면 두 번째 질문을 이해해야합니다. 이 게시물에 대한 수많은 답변은 이것이 컨벤션이라고 설명했으며이 컨벤션이 제공하는 몇 가지 장점을 나열했습니다. 이러한 장점 중 일부는 아래에 요약되어 있습니다.
응용 프로그램이 성공하면 0을 반환하고 실패하면 0이 아닌 이유는 무엇입니까?
작업을 호출하는 코드는 작업의 종료 상태에 대해 두 가지를 알아야합니다. 작업이 성공적으로 종료 되었습니까? [* 1] 그리고 작업이 성공적으로 종료되지 않은 경우 작업이 성공적으로 종료 된 이유는 무엇입니까? 모든 값을 사용하여 성공을 나타낼 수 있습니다. 그러나 0은 플랫폼간에 이식 가능하기 때문에 다른 숫자보다 편리합니다. 2011 년 8 월 16 일 이 질문 에 대한 xibo의 답변 요약 :
0은 인코딩에 독립적입니다.
32 비트 정수 단어에 one (1)을 저장하려는 경우 첫 번째 질문은 "빅 엔디안 단어 또는 리틀 엔디안 단어?"와 "바이트가 리틀 엔디안 단어를 구성하는 길이?"입니다. ", 0은 항상 동일하게 보입니다.
또한 어떤 사람들은 errno를 어떤 시점에서 char 또는 short로 캐스팅하거나 심지어 float로 캐스팅 할 것으로 예상해야합니다. (int) ((char) ENOLCK)는 char 길이가 8 비트 이상 (UNIX에서 7 비트 ASCII char 시스템을 지원함)이 아닐 때 ENOLCK가 아닌 반면 (int) ((char) 0)은 char의 건축 세부 사항.
0이 성공에 대한 반환 값이라고 결정되면 0이 아닌 값을 실패에 사용하는 것이 좋습니다. 이를 통해 많은 종료 코드 가 작업이 실패한 이유에 대한 질문에 답할 수 있습니다 .
셸에서 0이 참이지만 거짓이 1 인 이유는 무엇입니까?
쉘의 기본적인 사용법 중 하나는 스크립팅을 통해 프로세스를 자동화하는 것입니다. 일반적으로 이것은 작업을 호출 한 다음 작업의 종료 상태에 따라 조건부로 다른 작업을 수행하는 것을 의미합니다. Philippe A. 는이 게시물에 대한 그의 답변에서
일반적으로 bash 및 유닉스 셸에서 반환 값은 부울이 아닙니다. 정수 종료 코드입니다.
그런 다음 이러한 작업의 종료 상태를 부울 값으로 해석해야합니다. 성공 ( 0
) 종료 상태를 true 로 매핑하고 0이 아닌 / 실패 종료 상태를 false 로 매핑하는 것이 좋습니다 . 이렇게하면 연결된 쉘 명령을 조건부로 실행할 수 있습니다.
여기에 예가 mkdir deleteme && cd $_ && pwd
있습니다. 쉘이 0을 참으로 해석하기 때문에이 명령은 예상대로 편리하게 작동합니다. 쉘이 0을 거짓으로 해석한다면 각 작업에 대해 해석 된 종료 상태를 반전해야합니다.
요컨대, 응용 프로그램이 성공적인 종료 상태에 대해 0을 반환한다는 규칙을 고려할 때 쉘이 0을 거짓으로 해석하는 것은 의미가 없습니다.
[* 1] : 예, 여러 번 작업에서 단순한 성공 메시지 이상을 반환해야하지만 이는이 스레드의 범위를 벗어납니다.
고급 Bash 스크립팅 가이드의 부록 E 를 참조하십시오.