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

Re: Stop script if one command returns != 0



# p.stephenson@xxxxxxxxxxx / 2014-05-14 15:20:11 +0100:
> On Wed, 14 May 2014 16:01:19 +0200
> Florian Lindner <mailinglists@xxxxxx> 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



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