zsh-workers
 help / color / mirror / code / Atom feed
From: Bart Schaefer <schaefer@brasslantern.com>
To: zsh-workers@zsh.org
Subject: Re: Function code breaking out of if then ...fi
Date: Fri, 02 Nov 2012 14:39:11 -0700	[thread overview]
Message-ID: <121102143911.ZM14168@torch.brasslantern.com> (raw)
In-Reply-To: <CAPHw+0WsmZAsfMVyE0zYkq46=qHFH8U_6qNRD=JbNti2_oMd_A@mail.gmail.com>

On Nov 2, 10:09am, Michal Maruska wrote:
}
} I wonder if the following behaviour is a bug, or
} simply my wrong expectation:
} 
} This script, assuming the globbing fails, and I'm not using NULL_GLOB,
} does not bother finishing the commands in the "then ....fi" block,
} instead continues after "fi".

This doesn't really have anything to do with the function.  The same
thing happens with

if true;
then
    echo non-existing*
    exit 0
fi

What slightly surprises me is that a glob failure isn't considered an
error for purposes of ERR_EXIT (the -e option in your #! line).  I
would have expected the whole script to quit at that point, but I guess
glob errors are not treated as command failures because the command
never executes in the first place.

However, what *is* happening is that a glob failure in a complex command
acts in the manner of a "break" statement.  This is to prevent runaway
loops spewing the same globbing error ad infitinum; I remember that this
change was made a long while ago, but I don't recall exactly when, and
it appears it would take a major excavation to find it in the ChangeLog.

The trouble of course is that a "break" statement isn't supposed to have
any effect in the body of an "if", but although actually using "break"
in that context is not allowed, the same logic isn't applied when the
internal error-flag gets set by a glob failure, and zsh bails out of
the if-body the same way it would from a loop-body.

Whether this is a bug could be argued either way.  NOMATCH occupies a
sort of grey area between parser-detectable syntax error and run-time
command failure.

} I was advised (on IRC) to use
} 
} { fn } always { TRY_BLOCK_ERROR=0 }

This is a workaround, because it introduces a new complex command (the
braced expression to the left of "always") and gives you a hook for
clearing the error before it affects any surrounding complex command.  
But that would be the wrong place to document this behavior of NOMATCH.


  reply	other threads:[~2012-11-02 21:40 UTC|newest]

Thread overview: 12+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-11-02  9:09 Michal Maruska
2012-11-02 21:39 ` Bart Schaefer [this message]
2012-11-05  8:22   ` Han Pingtian
2012-11-05  9:31     ` Han Pingtian
2012-11-05 14:29   ` Peter Stephenson
2012-11-05 14:55     ` Peter Stephenson
2012-11-05 16:08       ` Peter Stephenson
2012-11-06  6:47         ` Han Pingtian
2012-11-09 22:52       ` Peter Stephenson
2012-11-10  1:13         ` Bart Schaefer
2012-11-10 21:23           ` Peter Stephenson
2012-11-12 10:24             ` 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=121102143911.ZM14168@torch.brasslantern.com \
    --to=schaefer@brasslantern.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).