Zsh Mailing List Archive
Messages sorted by: Reverse Date, Date, Thread, Author

Re: Zsh does not follow POSIX when return is called during the action of a trap



On Wed, Mar 12, 2014 at 05:03:09PM +0000, Peter Stephenson wrote:
> On Wed, 12 Mar 2014 09:52:10 -0700
> Bart Schaefer <schaefer@xxxxxxxxxxxxxxxx> wrote:
> > Have you tried this with the POSIX_TRAPS option set?
> > 
> > Zsh does not in general conform to POSIX at all unless you run it with
> > the appropriate compatibility settings.
I see. Well, I now ran the code with 'emulate sh' (thanks Peter, for
the suggestion).

These are the results:

|      12 zsh: 2
|     988 zsh: 3
| zsh 5.0.5-dev-0 (x86_64-unknown-linux-gnu)

For this new code:

| code='
| emulate sh
| 
| trap "(exit 2); return" USR1
| f() {
|     { echo; kill -USR1 $$; } | exit 3
|     return 5
| }
| 
| (exit 7); f
| '
| 
| shells=(
|     zsh
| )
| 
| for attempt in {1..1000}; do
|     for shell in "${shells[@]}"; do
| 	printf '%s: %s\n' "$shell" "$($shell -c "$code"; echo $?)"
|     done
| done | sort | uniq -c
| 
| zsh --version



> However, I'm trying to work out what happens with the case
> 
> |  trap '(exit BEFORE-RETURN); return EXPLICIT-RETURN-VALUE' SIGNAL
> |
> |  fn() {
> |    (exit BEFORE-ACTION); -block here waiting for signal-
> |  }
> 
> Should this exit with EXPLICIT-RETURN_VALUE or BEFORE-ACTION?  The
> latter is easier to implement but my guess (without ploughing through
> the standard) is EXPLICIT-RETURN-VALUE is right here.
> 
> pws
> 
Ah, I see. I tested with this:

| code='
| emulate sh
| 
| trap "(exit 2); return 9" USR1
| f() {
|     { echo; kill -USR1 $$; } | exit 3
|     return 5
| }
| 
| (exit 7); f
| '
| 
| shells=(
|     zsh
| )
| 
| for attempt in {1..1000}; do
|     for shell in "${shells[@]}"; do
|   printf '%s: %s\n' "$shell" "$($shell -c "$code"; echo $?)"
|     done
| done | sort | uniq -c
| 
| zsh --version

And got:

|     991 zsh: 3
|       9 zsh: 9
| zsh 5.0.5-dev-0 (x86_64-unknown-linux-gnu)

Which is kind of wrong, since it should always be 9, but according to
the results, it's mostly 3. POSIX states:

| 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, the last command is
| considered to be the command that executed immediately preceding the trap
| action.

So, the result should be 9 ("'?' shall be set to n [...] or the exit
status of the last command [...]"). Because in this case 'n' is set.

-- 
Eduardo Alan Bustamante López



Messages sorted by: Reverse Date, Date, Thread, Author