Zsh Mailing List Archive
Messages sorted by:
Reverse Date,
Date,
Thread,
Author
Re: Inconsistent behavior of ERR_EXIT with conditionals
- X-seq: zsh-workers 50913
- From: Lawrence Velázquez <larryv@xxxxxxx>
- To: "Bart Schaefer" <schaefer@xxxxxxxxxxxxxxxx>, "Philippe Altherr" <philippe.altherr@xxxxxxxxx>
- Cc: zsh-workers@xxxxxxx
- Subject: Re: Inconsistent behavior of ERR_EXIT with conditionals
- Date: Tue, 08 Nov 2022 03:04:12 -0500
- Archived-at: <https://zsh.org/workers/50913>
- Feedback-id: iaa214773:Fastmail
- In-reply-to: <CAH+w=7YCNXmVU8Os29tSr1JrnFpGw47EqRfiJKdXNp0P-3KPGw@mail.gmail.com>
- List-id: <zsh-workers.zsh.org>
- References: <CAGdYchsbWpFRsxS2CRzhdDix-B9osY_isv9nuBjbvt4nDTEWLA@mail.gmail.com> <CAH+w=7ZTSXUm6DLDk9k7z_V7YezKXJdcPi2uw1bTdmMjvTbkzg@mail.gmail.com> <CAH+w=7apH5_YnJtWT4x=mUOFhpHH1xMN9EkjjB0FJAi=8JQHdQ@mail.gmail.com> <CAGdYchsaiL-CuU96epSgCtrDqkkJ73mgNkZzY4FSp4-w4qkx+w@mail.gmail.com> <CAH+w=7YCNXmVU8Os29tSr1JrnFpGw47EqRfiJKdXNp0P-3KPGw@mail.gmail.com>
On Tue, Nov 8, 2022, at 12:36 AM, Bart Schaefer wrote:
> So you can see that zsh agrees with bash on your "Failure" cases. The
> output of dash (as /bin/sh on ubuntu) is the same as zsh with the
> exception of Failure-b, which can't be tested because there is no
> equivalent of "declare" (or "local").
Here is a set of tests incorporating most of Philippe's examples
(some slightly modified). In the output, "no" and "yes" are intended
to indicate whether the shell exited due to "set -e" / ERR_EXIT.
The tl;dr is that zsh agrees with other shells, except on three
constructs from Philippe's original email.
The shells I tested are zsh 5.9, bash 5.1.16(1)-release, ksh AJM
93u+ 2012-08-01, dash 0.5.11.5, and yash 2.52. For more fun, see
<https://www.in-ulm.de/~mascheck/various/set-e/>.
% head -n 100 *.sh(n) driver.zsh
==> 1.sh <==
f() {
{ false && true; }
}
f
printf ' no'
==> 2.sh <==
f() {
false && true
}
f
printf ' no'
==> 3.sh <==
f() {
if true; then
false && true
fi
}
f
printf ' no'
==> 4.sh <==
f() {
case foo in
*) false && true ;;
esac
}
f
printf ' no'
==> 5.sh <==
f() {
(false && true)
}
f
printf ' no'
==> 6.sh <==
: $(false)
printf ' no'
==> 7.sh <==
if [ "$KSH_VERSION" ]; then
f() { typeset v=$(false); }
else
f() { local v=$(false); }
fi
f
printf ' no'
==> 8.sh <==
if
false
printf ' no'
true
then
true
fi
==> 9.sh <==
{
false
printf ' no'
true
} && true
==> 10.sh <==
false && true
printf ' no'
==> 11.sh <==
! true
printf ' no'
==> driver.zsh <==
set -- *.sh(n)
printf ' '
printf ' %5s' $@
echo
for sh in zsh bash ksh dash yash; do
printf %4s: $sh
for arg; do
$sh -e $arg || printf ' yes'
done
echo
done
% zsh driver.zsh
1.sh 2.sh 3.sh 4.sh 5.sh 6.sh 7.sh 8.sh 9.sh 10.sh 11.sh
zsh: no yes no no yes no no no no no no
bash: yes yes yes yes yes no no no no no no
ksh: yes yes yes yes yes no no no no no no
dash: yes yes yes yes yes no no no no no no
yash: yes yes yes yes yes no no no no no no
> Bash disagrees with dash and
> zsh on your "Success" cases, at least at that version.
Bash disables "set -e" in command substitutions and has done so
since at least 1.14 (the oldest version I can test). Bash 4.4 added
an option that causes command substitutions to inherit "set -e",
but it remains disabled by default (except in POSIX mode).
--
vq
Messages sorted by:
Reverse Date,
Date,
Thread,
Author