zsh-workers
 help / color / mirror / code / Atom feed
From: "Eduardo A. Bustamante López" <dualbus@gmail.com>
To: Peter Stephenson <p.stephenson@samsung.com>
Cc: zsh-workers@zsh.org
Subject: Re: Zsh does not follow POSIX when return is called during the action of a trap
Date: Wed, 12 Mar 2014 10:47:14 -0700	[thread overview]
Message-ID: <20140312174714.GA13516@dualbus.me> (raw)
In-Reply-To: <20140312170309.48ea7444@pwslap01u.europe.root.pri>

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@brasslantern.com> 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


  reply	other threads:[~2014-03-12 17:47 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-03-12 15:36 Eduardo A. Bustamante López
2014-03-12 16:52 ` Bart Schaefer
2014-03-12 17:03   ` Peter Stephenson
2014-03-12 17:47     ` Eduardo A. Bustamante López [this message]
2014-03-12 17:49     ` Chet Ramey
2014-03-12 18:23       ` Peter Stephenson

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20140312174714.GA13516@dualbus.me \
    --to=dualbus@gmail.com \
    --cc=p.stephenson@samsung.com \
    --cc=zsh-workers@zsh.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this public inbox

	https://git.vuxu.org/mirror/zsh/

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).