bash의 리턴 코드, exit code는 아무렇게나 주는 것이 아니고 http status code처럼 어느 정도 정해진 코드가 있다. 그래서 여기서 간단히 정리해 보려고 한다. 이미 다른 곳에서 다들 많이 정리하는 기본적인 내용이기 때문에 크게 특별한 내용은 없다.

먼저 exit code를 정리하기 전에 알아두어야 할 것은, 코드 0이라는 것은 쉘 위에서는 항상 정상 종료라는 것이다. 이것은 공리와도 같은 것이라, 어떤 어플리케이션을 만들고 exit code를 설계할 때에는 정상 동작했을 때 무조건 0을 주어야 한다. 정상 동작의 완료가 여러 케이스(이런 케이스가 있을까?)라 하더라도 무조건 0이다. 예를 들어 쉘 옵션 set -e가 적용되었는데 0 이외 리턴이 발생했다면 스크립트는 거기서 종료된다. 0이 아닌 나머지는 무조건 에러 상태로 보기 때문이다.

CodeMeaningComments
1일반적인 모든 에러일반적인 모든 에러에 이 코드가 적용된다.
2잘못된 쉘 사용쉘을 잘못 사용하였다면 발생, 예를 들어 빈 함수를 작성한 경우
126실행이 안될 때실행 가능이 아니거나 권한 문제로 인해 실행 실패할 경우
127Command not found$PATH등의 문제, 혹은 오타로 인한 실행 실패
128exit code가 비정상일 경우exit code가 잘못된 경우, 예를 들어 exit 3.141592
128+n시그널로 인한 종료예를 들어 SIGKILL(9)를 받아 프로세스가 종료되면 128+9, 137이 에러 코드이다. 따라서 130은 128+SIGINT(2)
255exit code가 정상 범위를 벗어난 경우-1은 허용되지 않는다. exit code는 0~255의 범위를 가진다.

출처: https://tldp.org/LDP/abs/html/exitcodes.html

어떤 쉘 스크립트 혹은 어플리케이션을 작성했다면 이 지정된 코드 위주로 최대한 출력을 맞추고 그 이외 특이한 케이스나 정확한 핸들링을 위해서 부가적인 코드를 매겨주면 될 것 같다. 적당한 범위는 대략 10~120, 200~240 이정도 범위면 될 것 같은데 중요한 것은 겹치는 부분을 만들어 기존 코드의 의미를 해치지만 않으면 될 것 같다.

기존 어플리케이션들의 exit code는 보통 man페이지에 보면 나와 있는데, 모든 어플리케이션에 대해서 정리되어 있는 것은 아니지만 그래도 주요한 어플리케이션이라면 거의 정리되어 있다고 보면 된다.

  • apt-get: 정상적으로는 0을 주지만 실패 시 100을 리턴한다. 권한 문제로 인해 실패했더라도 126을 주지 않고 100을 전달한다.
  • ls: 0은 정상, 1은 사소한 문제, 2는 중대한 문제일 때 리턴한다. 예로는 cannot access subdirectory일 때 1, cannot access command-line argument일 때 2라는데, 코드를 보고 위 테이블을 보면 무슨 느낌인지 이해가 간다.
  • curl: 이건 1부터 거의 100여개를 다 지정해 놓았다. HTTP 에러라는 게 여러가지 상황에 따라 단순하지 않으므로 굉장히 복잡한 것 같다. 반면 이렇게 자세하므로 굉장히 다양한 예외 처리도 가능할 것 같다.
  • wget: 1부터 8까지 지정되어 있다.
  • xargs: 1과 123, 124, 125, 126, 127에 대해 지정되었다. 특히 126은 if the command cannot be run, 127은 if the command is not found인데, 위 테이블의 exit code와 잘 맞춰놓은 것 같다.