Subject: Re: NetBSD master CVS tree commits
To: Bruce Albrecht <>
From: Greg A. Woods <>
List: current-users
Date: 06/05/1996 16:02:31
[ On Tue, June  4, 1996 at 16:40:36 (-0500), Bruce Albrecht wrote: ]
> Subject: Re: NetBSD master CVS tree commits
> Greg A. Woods writes:
>  > > Modified Files:
>  > > 	eval.c 
>  > > Log Message:
>  > > Fix PR/2504: return with no args returns 0 instead of the return value of
>  > > the previous command in functions
>  >  
>  > I think this PR was in error.

I recant.  It seems the Log Message above describes the problem, and not
the fix....

> I wrote this PR, and maybe the fix, I submitted one with my PR.  I was
> seeing an exit value of zero when a function returned with a return
> statement with no parameters, but all of my references (except for the
> O'Reilly ksh book) indicated that this was wrong. I don't have a copy
> of P1003.2, but if you can tell me where it's online, I'll check it
> out.

I don't think the P1003.2 drafts are online anywhere any more.  They've
all been withdrawn pending approval of the final standard, so nobody can
legally give you any possibly archived copy.  ;-)

> Does the following excerpt really talk about the return command, or
> just function exit status?
>  > From P1003.2/D11.2 section 3.9.5, p. 276:
>  > 
>  >  Exit_Status
>  > 
>  >  The exit status of a function definition shall be zero if the function
>  >  was declared successfully; otherwise, it shall be greater than zero.  The
>  >  exit status of a function invocation shall be the exit status of the last
>  >  command executed by the function.

Good question.  No, it doesn't talk about the 'return' command itself.
Return is really a rather trivial little guy though, and he doesn't
really do anything but potentially fiddle with the value of ? (and of
course cause the function to return, be it the last statement or not.

Here's the description from P1003.2/D11.2 p. 305-306:

 3.14.10  return - Return from a function

       return [n]

 The return utility shall cause the shell to stop executing the current
 function or dot script (see 3.14.4).  If the shell is not currently
 executing a function or dot script, the results are unspecified.


 The value of the special parameter ? shall be set to n, an unsigned
 decimal integer, or to the exit status of the last command executed if n
 is not specified.  If the value of n is greater than 255, the results are
 undefined.  When return is executed in a trap action (see 3.14.13), the
 ``last command'' is considered to be the command that executed
 immediately preceding the trap action.

 BEGIN_RATIONALE  return Rationale. (This subclause is not a part of P1003.2)

 The behavior of return when not in a function or dot script differs
 between the System V shell and the KornShell.  In the System V shell this
 is an error, whereas in the KornShell, the effect is the same as exit.

 The results of returning a number greater than 255 are undefined because
 of differing practices in the various historical implementations.  Some
 shells AND out all but the low order 8 bits; others allow larger values,
 but not of unlimited size.

 See the discussion of appropriate exit status values in          1

 END_RATIONALE                                                              1

In other words, what a 'return' statement does is set the ? parameter to
'n', and not specifying 'n' is the same as giving "$?".  From there the
clause in 3.9.5 simply can be interpreted to say that the exit status of
the function is the value of the ? parameter at exit.

> Are you saying that without the patched eval.c, /bin/sh on NetBSD is
> returning a non-zero value for the above or for your example below?
> If it is, then I'd like to figure out why my versions of NetBSD
> (Amiga, 1.1 and 1.2_ALPHA) are not functioning as expected.

Nope.  I haven't yet tested any of this with *any* *BSD shell.  ;-)

							Greg A. Woods

+1 416 443-1734			VE3TCP			robohack!woods
Planix, Inc. <>; Secrets Of The Weird <>