| Appendix E. Exit Codes With Special Meanings
Table E-1. Reserved Exit Codes Exit Code Number | Meaning | Example | Comments | 1 | Catchall for general errors | let "var1 = 1/0" | Miscellaneous errors, such as "divide by zero" and other impermissible operations | 2 | Misuse of shell builtins (according to Bash documentation) | empty_function() {} | Missing keyword or command | 126 | Command invoked cannot execute | /dev/null | Permission problem or command is not an executable | 127 | "command not found" | illegal_command | Possible problem with $PATH or a typo | 128 | Invalid argument to exit | exit 3.14159 | exit takes only integer args in therange 0 - 255 (seefirst footnote) | 128+n | Fatal error signal "n" | kill -9 $PPID of script | $? returns 137 (128 + 9) | 130 | Script terminated by Control-C | Ctl-C | Control-C is fatal error signal 2, (130 = 128 + 2, see above) | 255* | Exit status out of range | exit -1 | exit takes only integer args in the range 0 - 255 | According to the above table, exit codes 1 - 2, 126 - 165, and 255have special meanings, and should therefore be avoided foruser-specified exit parameters. Ending a script with exit127 would certainly cause confusion when troubleshooting(is the error code a "command not found" or auser-defined one?). However, many scripts use an exit1 as a general bailout-upon-error. Since exit code1 signifies so many possible errors,it is not particularly useful in debugging.
There has been an attempt to systematize exit status numbers(see /usr/include/sysexits.h),but this is intended for C and C++ programmers. A similarstandard for scripting might be appropriate. The author ofthis document proposes restricting user-defined exit codes tothe range 64 - 113 (in addition to0, for success), to conform withthe C/C++ standard. This would allot 50 valid codes, and maketroubleshooting scripts more straightforward. All user-defined exit codes in the accompanying examples tothis document conform to this standard, except where overridingcircumstances exist, as in Example 9-2. | Issuing a $? fromthe command-line after a shell script exits givesresults consistent with the table above only from theBash or sh prompt. Running theC-shell or tcshmay give different values in some cases. | |
| |