zsh-users
 help / color / mirror / code / Atom feed
From: Roman Neuhauser <neuhauser@sigpipe.cz>
To: Peter Stephenson <p.stephenson@samsung.com>
Cc: zsh-users@zsh.org
Subject: Re: Stop script if one command returns != 0
Date: Wed, 14 May 2014 18:22:48 +0200	[thread overview]
Message-ID: <20140514162248.GE1629@isis.sigpipe.cz> (raw)
In-Reply-To: <20140514152011.7a811dcb@pwslap01u.europe.root.pri>

# p.stephenson@samsung.com / 2014-05-14 15:20:11 +0100:
> On Wed, 14 May 2014 16:01:19 +0200
> Florian Lindner <mailinglists@xgm.de> wrote:
> > I have a script that I source with a number of commands and exports. Is 
> > there a way to tell zsh (or even in a portable way to sh) to stop 
> > execution of this script if any of the commands returns a return code 
> > other than zero?
> 
> (Count the responses.  I'm guessing 3 to 5...)
> 
> set -e
> 
> is standard across Bourne-like shells including zsh --- this is
> equivalent to the zsh option "ERREXIT".

errexit as specified by SUS/POSIX is mostly useless and very dangerous.

http://pubs.opengroup.org/onlinepubs/9699919799/:

% The -e setting shall be ignored when executing the compound list
% following the while, until, if, or elif reserved word, a pipeline
% beginning with the ! reserved word, or any command of an AND-OR list
% other than the last.

you might think this means that

if { f; g; h}; then ... fi
will execute all of f, g, h no matter if any of them fails.
that's true, but not the whole truth: errexit won't be in effect
*globally* while the condition is getting executed.  this goes down
to functions:

---------- 8< ----------
#!/bin/sh

set -e

f()
{
  # h must not run when g fails;
  # we have errexit, hooray!
  do-this
  do-that
}
  
if f; then # f is executed with set +e in effect !!!
  ...
fi

f && echo ok # again, f runs with set +e
---------- >8 ----------

http://austingroupbugs.net/view.php?id=537

-- 
roman


  parent reply	other threads:[~2014-05-14 16:31 UTC|newest]

Thread overview: 9+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-05-14 14:01 Florian Lindner
2014-05-14 14:19 ` Chris Johnson
2014-05-14 14:20 ` Peter Stephenson
2014-05-14 14:31   ` Florian Lindner
2014-05-14 15:10     ` Bart Schaefer
2014-05-14 16:22   ` Roman Neuhauser [this message]
2014-05-14 14:21 ` Florian Lindner
2014-05-14 14:35   ` Peter Stephenson
2014-05-14 14:49     ` 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=20140514162248.GE1629@isis.sigpipe.cz \
    --to=neuhauser@sigpipe.cz \
    --cc=p.stephenson@samsung.com \
    --cc=zsh-users@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).