Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 24 May 2009 19:20:05 GMT
From:      Jilles Tjoelker <jilles@stack.nl>
To:        freebsd-bugs@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
Message-ID:  <200905241920.n4OJK5CC039584@freefall.freebsd.org>

next in thread | raw e-mail | index | archive | help
The following reply was made to PR bin/124748; it has been noted by GNATS.

From: Jilles Tjoelker <jilles@stack.nl>
To: Garrett Cooper <gcooper@FreeBSD.org>
Cc: bug-followup@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@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



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200905241920.n4OJK5CC039584>