Appendix D. Exit Codes With Special Meanings
Table D-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" |
2 | Misuse of shell builtins (according to Bash documentation) | | Seldom seen, usually defaults to exit code
1 |
126 | Command invoked cannot execute | | Permission problem or command is not an executable |
127 | "command not found" | | Possible problem with $PATH or a typo |
128 | Invalid argument to exit | exit 3.14159 | exit takes only integer args in the
range 0 - 255 (see
footnote) |
128+n | Fatal error signal "n" | kill -9 $PPID of script | $? returns
137 (128 + 9) |
130 | Script terminated by Control-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 255
have special meanings, and should therefore be avoided for
user-specified exit parameters. Ending a script with exit
127 would certainly cause confusion when troubleshooting
(is the error code a "command not found" or a
user-defined one?). However, many scripts use an exit
1 as a general bailout upon error. Since exit code
1 signifies so many possible errors,
this probably would not be helpful 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 similar
standard for scripting might be appropriate. The author of
this document proposes restricting user-defined exit codes to
the range 64 - 113 (in addition to
0, for success), to conform with
the C/C++ standard. This would allot 50 valid codes, and make
troubleshooting scripts more straightforward.
All user-defined exit codes in the accompanying examples
to this document now conform to this standard, except
where overriding circumstances exist, as in Example 9-2.
| Issuing a $? from
the command line after a shell script exits gives results
consistent with the table above only from the Bash or
sh prompt. Running the C-shell or
tcsh may give different values in some
cases. |