부록 C. 특별한 의미를 갖는 종료 코드

표 C-1. "예약된" 종료 코드

종료 코드 번호예제비고
1광범위한 일반적 에러let "var1 = 1/0""divide by zero"같은 잡다한 에러
2bash 문서에 명시되어 있는 쉘 내장명령어의 오사용 거의 보기 힘들고 보통은 디폴트로 1번 종료 코드로 나타남
126실행 불가능한 명령어의 구동 퍼미션 문제거나 실행 허가가 없는 명령어
127"command not found" $PATH 문제거나 오타일 가능성 있음
128exit에 잘못된 인자 넘김exit 3.14159exit는 0에서 255사이의 정수만 받음
128+n치명적 에러 시그널 "n"kill -9 스크립트의 $PPID$?는 137 (128 + 9)을 리턴
130스크립트가 Control-C에 의해 종료됨 Control-C 는 치명적 에러 시그널 2번(130 = 128 + 2, 바로 위 참고)
255종료 상태 범위 초과exit -1exit는 0에서 255사이의 정수만 받음

위의 테이블을 보면 1 - 2, 126 - 165, 255 번 종료 코드는 특별한 의미를 갖고 있기 때문에 사용자가 임의대로 exit 의 매개변수로 쓰면 안 됩니다. 예를 들어, 스크립트를 exit 127로 끝내면 나중에 문제가 생겨 해결하려고 할 때에 혼란을 가져올 수 있습니다(이 에러가 "command not found"인지 사용자가 정의한 것인지). 그렇긴 하지만 많은 스크립트들이 에러 발생시 종료를 위해 보통 exit 1을 씁니다. 1번 종료 코드는 생길수 있는 다양한 형태의 에러를 나타내기 때문에 사용자 정의 에러도 충분히 포함될 수 있습니다. 하지만 다른 면에서 보면 이렇게 했을 경우 유용한 정보를 나타내지 않는다는 것도 알아두세요.

종료 상태 번호(/usr/include/sysexits.h 참고)를 체계적으로 분류하려는 노력이 있었지만 이는 C, C++ 프로그래머들을 위한 것이었습니다. 하지만 이를 스크립트용으로 비슷하게 적용해도 괜찮을 듯 싶습니다. 저자가 제안하는 방법은 사용자 정의 종료 코드를 64 - 113(성공시 0도 포함)으로 제한해서 C/C++ 표준을 따르는 것입니다. 이렇게 해도 사용자는 여전히 50개의 코드를 쓸 수 있는 있기 때문에 나중에 스크립트의 문제를 좀 더 깔끔하게 해결할 수 있습니다.

이 문서에서 소개해 드린 예 9-2를 제외한 모든 예제들에서 쓰이는 사용자 정의 종료 코드는 지금 설명 드린 표준을 따릅니다.

참고: 쉘 스크립트가 종료한 뒤 명령어 줄에서 $?를 쳐서 나오는 결과는 위의 테이블에서 설명드린것과 일치하지만 이는 오직 bash나 sh에서만 적용됩니다. C 쉘이나 tcsh의 경우에는 몇몇 경우에 다른 결과값이 나옵니다.