bin/124748: [patch] sh(1): sh -c 'exit -1' fails with "Illegal
number: -1", instead of exiting with a code of 255
Jilles Tjoelker
jilles at stack.nl
Sun May 24 19:20:05 UTC 2009
The following reply was made to PR bin/124748; it has been noted by GNATS.
From: Jilles Tjoelker <jilles at stack.nl>
To: Garrett Cooper <gcooper at FreeBSD.org>
Cc: bug-followup at freebsd.org
Subject: Re: bin/124748: [patch] sh(1): sh -c 'exit -1' fails with "Illegal
number: -1", instead of exiting with a code of 255
Date: Sun, 24 May 2009 21:14:57 +0200
On Sun, Apr 26, 2009 at 06:46:43PM -0700, Garrett Cooper wrote:
> On Sun, Apr 26, 2009 at 7:40 AM, Jilles Tjoelker <jilles at stack.nl> wrote:
> > Do people actually use 'exit -1' instead of the clearer 'exit 255'? '-1'
> > is not an unsigned integer, so not a posix compliant parameter to the
> > exit special builtin. Even then, sh still aborts a script with a nonzero
> > exit code if exit is used wrongly like this.
> Some people do, but I've since then stopped doing this.
> The question I have is:
> - Is the value of the return code uint8_t?
On the kernel level it is, see wait4(2) and exit(3).
On the shell level this is not necessarily the case.
FreeBSD's /bin/sh allows more bits to be 'return'ed from functions and
to appear in $?; it seems unwise to take advantage of this.
ksh93 uses 256+sig instead of 128+sig for commands terminated by
signals, which makes it possible for the shell to replicate command exit
status more precisely. For example:
ksh93 -c 'sh -c "kill -9 \$\$"; exit'
exits on signal 9, not with status 137. This does not work entirely
correctly -- for example, replacing exit with exit $? makes it
exit with status 9 -- but I think it can be done properly. On the other
hand this may not be so nice with logged signals (SIGSEGV etc).
> - Where in the documentation for sh(1) does it say that it can't be
> <0? Here are all of the relevant documentation items for exit codes I
> could find:
> Command Exit Status
> Each command has an exit status that can influence the behavior of other
> shell commands. The paradigm is that a command exits with zero for nor-
> mal or success, and non-zero for failure, error, or a false indication.
> The man page for each command should indicate the various exit codes and
> what they mean. Additionally, the built-in commands return exit codes,
> as does an executed shell function.
> If a command is terminated by a signal, its exit status is 128 plus the
> signal number. Signal numbers are defined in the header file
> <sys/signal.h>.
> ----
> exit [exitstatus]
> Terminate the shell process. If exitstatus is given it is used
> as the exit status of the shell; otherwise the exit status of the
> preceding command is used.
> ----
> Nowhere in the above documentation does it mention valid limits being
> in the set, [0, 128+SIGRTMAX] => [0, 254]. It's merely implied by the
> resources at one's disposal (the source, sys/signal.h, etc).
I suppose that could be added (0..255).
--
Jilles Tjoelker
More information about the freebsd-bugs
mailing list