shell -e (exit on error) (mis)behaviour

Shellfalsenon-exist()-caught()-uncaught{}-caught{}-uncaughtfalse || false+e(-e)+e{-e}
Solaris9-SHX255X10C0 X2550 X2550 X255X255
FreeBSD[2-6]-SH
NetBSD1.3.2-SH
X1X1270C0 X10 X10 X1X1
Ultrix4.4-SHX1X10 X10 X10 X10 X1X1
Ultrix4.4-KSHX1X1010 X1010 X1X1
Irix6.5-SH
Irix6.5-KSH
Solaris9-KSH
*-KSH93
OpenBSD3.7-SH
*-PDKSH5.2.14.2
*-ZSH4.[23].*
FreeBSD7-SH
X1X127010 X1010 X1X1
*-ZSH5.*.*
FreeBSD-[89]-SH
OpenBSD6.1-SH
Ubuntu-Dash-0.5.7
Ubuntu-Bash-4.3.11
X1X127010 X1010 X1X10C X10 X1
*-ZSH3.1.6
BASH-4.0.*
X1X1010 X1010 X1X1
*-BASH-3.2X1X1010010 X1X1
*-BASH-{2,3.[01]}
Debian-DASH
X1X127010010 X1X1
NetBSD2.0-SHX1X127010010 X1-
SUSv3/POSIXX1 ?X127 ?01 ?0 ?01 ?0 X1 ?X1 ?0C X10 X1

Where:

false
false
non-existent
try to run a non-existent command
()-caught
( echo 0; false ; echo 1 ; ) || echo "Caught"
()-uncaught
( echo 0; false ; echo 1 ; )
{}-caught
{ echo 0; false ; echo 1 ; } || echo "Caught"
{}-uncaught
{ echo 0; false ; echo 1 ; }
false || false
false || false
+e(-e)
set +e; ( set -e; echo 0; false; echo 1; ); R=$?; if [ $R -ne 0 ]; then echo Caught; exit $R; fi; set -e
+e{-e}
set +e; { set -e; echo 0; false; echo 1; }; R=$?; if [ $R -ne 0 ]; then echo Caught; exit $R; fi; set -e
and
X<num>
shell exits with exitcode <num>
-
no output (no exit).
0
0 echoed (usually exits as well).
01
0 and 1 echoed (no exit). It seems as it thinks the commands are guarded but the guard doesn't trigger because "echo 1" returns 0.
0C
0 and Caught echoed (no exit). The guard triggers the moment 'false' returns non-0.

Austin group comments on something similar
marcolz@stack.nl (Marc Olzheim)

<-Back to marcolz's homepage.