Bourne | Ash |  #!  | find | ARG_MAX | Shells | whatshell | portability | permissions | UUOC | ancient | - | ../Various | HOME
"$@" | echo/printf | set -e | test | tty defs | tty chars | $() vs ) | IFS | using siginfo | nanosleep | line charset | locale


"set -e" in various shells

2015-10-15 (see recent changes)

Variations in the handling of set -e and the resulting exit status among the various traditional and POSIX conformant implementations.

Here are deep links to the definition in SUSv2, SUSv3, SUSv4.
See a discussion (and the topic igniting it a few days before) about this on the Austin Group (SUS/POSIX) discussion mailing list archive, starting on Feb 16 2009
with consensus that the wording has to be improved to become more consistent and to match existing practice.
See entry 0000537 (and the related 0000052) in the Austin Group Issue Tracker.

Possible questions about set -e:

Using set -e has its quirks. As alternative, you can connect your commands with &&, or break out with ||alternative_cmd in critical places.

The following table lists tests results, most of them originate from or are inspired by the austin list.
Take the columns as pairs, with the shell output to the left and the exit status $? to the right.
A second table with tests suggested by David Korn on the austin-list follows below. The two tables eventually should be merged.

commandline V7-sh $? SVR2
sh
ultrix
$? SVR3
sh
sun413
$? SVR4
sh
sun5.1
$? SVR4
sh
sun5.10
$? ksh86a
ep/ix
$? ksh88d
ep/ix
$? ksh88g
sun53
$? ksh88i
sun5.9
$? ksh93
-k
$? ksh93
-t
$? pdksh
-5.2.14
$? posh-
0.6.17
$? hist.
ash
$? bash-
1.05
$? bash-
1.14.0
$? bash-
1.14.7
$? bash-
3.2.48
$? bash-
3.2.48
--posix
$? bash-
4.0.35
$? bash-
4.0.35
--posix
$? dash-
0.3.4
$? dash-
0.3.8
$? dash-
0.5.5.1
$? dash-
0.5.5.1
-4
$? zsh-
3.0.8
$? zsh-
4.3.9
$?
        false; echo $?   1   1   255   255   255   1   1   1   1   1   1   1   1   1   1 0   255   1   1   1   1   1   1   1   1   1   1   1
set +e; false; echo $?   1   1 0   255 0   255 0   255 0   1 0   1 0   1 0   1 0   1 0   1 0   1 0   1 0   1 0   1 0   255 0   1 0   1 0   1 0   1 0   1 0   1 0   1 0   1 0   1 0   1 0   1 0
! false;  echo $?  N/A 1  N/A 1  N/A1  N/A1  N/A1  N/A1  N/A1  N/A1   0 0   0 0   0 0   0 0   0 0   N/A 2   N/A 0   0 0   0 0   0 0   0 0   0 0   0 0   0 0   0 0   0 0   0 0   0 0   0 0
! true ;  echo $?  N/A 1  N/A 1  N/A1  N/A1  N/A1  N/A1  N/A1  N/A1   1 0   1 0   1 0   1   1   N/A 2   N/A 0   1 0   1 0   1 0   1 0   1 0   1 0   1   1 0   1 0   1 0   1   1
! ! false ;  echo $?  N/A 1  N/A 1  N/A1  N/A1  N/A1  N/A1  N/A1  N/A1   1 0   1 0   1 0   1   1   N/A 2   N/A 0  N/A1  N/A 1  N/A 2  N/A 2  N/A 2  N/A 2   1  N/A 2  N/A 2  N/A 2  N/A0  N/A 1
(false;   echo foo); echo \ $?   1   1   255   255   255   1   1   1   1   1   1   1   1 0   1   foo 0 0   255 0   139   1 0   1 0   1   1   1   1 0   1 0   1   1   1
(! false; echo foo); echo \ $?  N/A 1  N/A 1  N/A1  N/A1  N/A1  N/A1  N/A1  N/A1   foo 0 0   foo 0 0   foo 0 0   foo 0 0   foo 0 0   N/A 2   N/A 0   foo 0 0   139   foo 0 0   foo 0 0   foo 0 0   foo 0 0   foo 0 0   foo 0 0   foo 0 0   foo 0 0   foo 0 0   foo 0 0
(! true;  echo foo); echo \ $?  N/A 1  N/A 1  N/A1  N/A1  N/A1  N/A1  N/A1  N/A1   foo 0 0   foo 0 0   foo 0 0   1   1 0   N/A 2   N/A 0   foo 0 0   139   foo 0 0   foo 0 0   foo 0 0   foo 0 0   1   foo 0 0   foo 0 0   foo 0 0   1   1
for i in .; do (false; echo foo); echo \ 1:$?; done; echo \ 2:$?   1   1   255   255   255   1   1   1   1   1   1   1   1:1 2:0 0   1   foo 1:0 2:0 0   1:255 2:0 0   139   1:1 2:0 0   1:1 2:0 0   1   1   1   1:1 2:0 0   1:1 2:0 0   1   1   1
for i in .; do false && true; echo \ 1:$?; done; echo \ 2:$?   1   1:1 2:0 0   1:255 2:0 0   1:255 2:0 0   1:255 2:0 0   1:1 2:0 0   1:1 2:0 0   1:1 2:0 0   1:1 2:0 0   1:1 2:0 0   1:1 2:0 0   1:1 2:0 0   1:1 2:0 0   1   1:1 2:0 0   1:255 2:0 0   1:1 2:0 0   1:1 2:0 0   1:1 2:0 0   1:1 2:0 0   1:1 2:0 0   1:1 2:0 0   1:1 2:0 0   1:1 2:0 0   1:1 2:0 0   1:1 2:0 0   1:1 2:0 0
for i in x x ; do echo x; false && true; done; echo \ 2:$?   x 1   xx 2:1 0   xx 2:255 0   xx 2:255 0   xx 2:255 0   ? ?   ? ?   xx 2:1 0   xx 2:1 0   xx 2:1 0   xx 2:1 0   x 1   x 1   x 1   xx 2:0 0   xx 2:255 0   xx 2:1 0   xx 2:1 0   xx 2:1 0   xx 2:1 0   xx 2:1 0   x 1   xx 2:1 0   xx 2:1 0   xx 2:1 0   xx 2:1 0   xx 2:1 0
false| true;             echo $?   1   0 0   0 0   0 0   0 0   0 0   0 0   0 0   0 0   0 0   0 0   0 0   0 0   0 0   0 0   0 0   0 0   0 0   0 0   0 0   0 0   0 0   0 0   0 0   0 0   0 0   0 0
true | false;            echo $?   1   1   255   255   255   1   1 0   1   1   1   1   1   1   1   1 0   255   1   1   1   1   1   1   1   1   1   1   1
true |(false; echo foo); echo \ $?   1   1   255   255   255   1   1 0   1   1   1   1   1   1   1   foo 0 0   255 0   139   1 0   1 0   1   1   1   1   1   1   1   1
         (false; echo foo)   |  cat     ; echo \ $?   1   0 0   0 0   0 0   0 0   0 0   0 0   0 0   0 0   0 0   0 0   0 0   0 0   0 0   foo 0 0   0 0   139   0 0   0 0   0 0   0 0   0 0   0 0   0 0   0 0   0 0   0 0
         (false; echo foo)   || echo bar; echo \ $?   1   foo 0 0   foo 0 0   foo 0 0   foo 0 0   foo 0 0   foo 0 0   foo 0 0   foo 0 0   foo 0 0   foo 0 0   foo 0 0   foo 0 0   bar 0 0   foo 0 0   foo 0 0   139   foo 0 0   foo 0 0   foo 0 0   foo 0 0   bar 0 0   foo 0 0   foo 0 0   foo 0 0   foo 0 0   foo 0 0
 (set -e; false; echo foo)   || echo bar; echo \ $?   1   foo 0 0   foo 0 0   foo 0 0   bar 0 0   foo 0 0   foo 0 0   foo 0 0   foo 0 0   foo 0 0   foo 0 0   foo 0 0   foo 0 0   bar 0 0   foo 0 0   foo 0 0   139   foo 0 0   foo 0 0   foo 0 0   foo 0 0   bar 0 0   foo 0 0   foo 0 0   foo 0 0   foo 0 0   foo 0 0
        { false; echo foo;}|  cat     ; echo \ $?   1   0 0   0 0   0 0   0 0   0 0   0 0   0 0   0 0   0 0   0 0   0 0   0 0   0 0   foo 0 0   0 0   139   0 0   0 0   0 0   0 0   0 0   0 0   0 0   0 0   0 0   0 0
        { false; echo foo;}|| echo bar; echo \ $?   1   foo 0 0   foo 0 0   foo 0 0   foo 0 0   foo 0 0   foo 0 0   foo 0 0   foo 0 0   foo 0 0   foo 0 0   foo 0 0   foo 0 0   1   foo 0 0   foo 0 0   foo 0 0   foo 0 0   foo 0 0   foo 0 0   foo 0 0   1   foo 0 0   foo 0 0   foo 0 0   foo 0 0   foo 0 0
{ set -e; false; echo foo;}|| echo bar; echo \ $?   1   foo 0 0   foo 0 0   foo 0 0   255   foo 0 0   foo 0 0   foo 0 0   foo 0 0   foo 0 0   foo 0 0   foo 0 0   foo 0 0   1   foo 0 0   foo 0 0   foo 0 0   foo 0 0   foo 0 0   foo 0 0   foo 0 0   1   foo 0 0   foo 0 0   foo 0 0   foo 0 0   foo 0 0
echo foo | while read x ; do (false) ; done; echo $?   1   1   255   255   255   1   1 0   1   1   1   1   1   1   1   0 0   255 0   139   1 0   1 0   1   1   1   1   1   1   1   1
echo foo | while read x ; do (false) ; done | true; echo $?   0 0   0 0   0 0   0 0   0 0   0 0   0 0   0 0   0 0   0 0   0 0   0 0   0 0   0 0   0 0   0 0   139   0 0   0 0   0 0   0 0   0 0   0 0   0 0   0 0   0 0   0 0
true  && false; echo $?   1   1   255   255   255   1 0   1   1   1   1   1   1   1   1   1 0   255   1   1   1   1   1   1   1   1   1   1   1
false && false; echo $?   1   1 0   255 0   255 0   255 0   1 0   1 0   1 0   1 0   1 0   1 0   1 0   1 0   1   1 0   255 0   1 0   1 0   1 0   1 0   1 0   1 0   1 0   1 0   1 0   1 0   1 0
false && true;  echo $?   1   1 0   255 0   255 0   255 0   1 0   1 0   1 0   1 0   1 0   1 0   1 0   1 0   1   1 0   255 0   1 0   1 0   1 0   1 0   1 0   1 0   1 0   1 0   1 0   1 0   1 0
       false || echo $?   1   1 0   255 0   255 0   255 0   1 0   1 0   1 0   1 0   1 0   1 0   1 0   1 0   1 0   1 0   255 0   1 0   1 0   1 0   1 0   1 0   1 0   1 0   1 0   1 0   1 0   1 0
       false || true;  echo $?   1   0 0   0 0   0 0   0 0   0 0   0 0   0 0   0 0   0 0   0 0   0 0   0 0   0 0   0 0   0 0   0 0   0 0   0 0   0 0   0 0   0 0   0 0   0 0   0 0   0 0   0 0
       false || false; echo $?   1   1   255   255   255   1 0   1   1   1   1   1   1   1   1   1 0   255   1   1   1   1   1   1   1   1   1   1   1
false `true` || echo $?   1   1   255   255   255   1 0   1 0   1 0   1 0   1 0   1 0   1 0   1 0   1 0   1 0   255 0   1 0   1 0   1 0   1 0   1 0   1 0   1 0   1 0   1 0   1 0   1 0
(false && false; echo foo) ; echo \ $?   1   foo 0 0   foo 0 0   foo 0 0   foo 0 0   foo 0 0   foo 0 0   foo 0 0   foo 0 0   foo 0 0   foo 0 0   foo 0 0   foo 0 0   1   foo 0 0   foo 0 0   139   foo 0 0   foo 0 0   foo 0 0   foo 0 0   foo 0 0   foo 0 0   foo 0 0   foo 0 0   foo 0 0   foo 0 0
(false && false          ) ; echo \ $?   1   1   255   255   255   1   1   1   1   1   1   1   1 0   1   1 0   255 0   139   1 0   1 0   1   1   1   1 0   1 0   1   1   1
if  false;  then :;   else        echo \ 1:$?; fi; echo \ 2:$?   1   1:1 2:0 0   1:255 2:0 0   1:255 2:0 0   1:255 2:0 0   1:1 2:0 0   1:1 2:0 0   1:1 2:0 0   1:1 2:0 0   1:1 2:0 0   1:1 2:0 0   1:1 2:0 0   1:1 2:0 0   1:1 2:0 0   1:1 2:0 0   1:255 2:0 0   1:1 2:0 0   1:1 2:0 0   1:1 2:0 0   1:1 2:0 0   1:1 2:0 0   1:1 2:0 0   1:1 2:0 0   1:1 2:0 0   1:1 2:0 0   1:1 2:0 0   1:1 2:0 0
if  false;  then :;   else false; echo foo;    fi; echo \ 2:$?   1   1   255   255   255   foo 2:0 0   1   1   1   1   1   1   1   1   foo 2:0 0   255   1   1   1   1   1   1   1   1   1   1   1
if  ! false;  then :; else        echo \ 1:$?; fi; echo \ 2:$?  N/A 1  N/A 1  N/A0  N/A0  N/A0  N/A0  N/A0  N/A0   2:0 0   2:0 0   2:0 0   2:0 0   2:0 0   N/A 0   N/A 0   2:0 0   2:0 0   2:0 0   2:0 0   2:0 0   2:0 0   2:0 0   2:0 0   2:0 0   2:0 0   2:0 0   2:0 0
if  ! false;  then :; else false; echo foo;    fi; echo \ 2:$?  N/A 1  N/A 1  N/A255  N/A255  N/A255  N/A0  N/A1  N/A1   2:0 0   2:0 0   2:0 0   2:0 0   2:0 0   N/A 1   N/A 0   2:0 0   2:0 0   2:0 0   2:0 0   2:0 0   2:0 0   2:0 0   2:0 0   2:0 0   2:0 0   2:0 0   2:0 0
if `false`; then :;   else        echo \ 1:$?; fi; echo \ 2:$?   1   1   255   255   255   1:1 2:0 0   1:1 2:0 0   1:1 2:0 0   1:1 2:0 0   1:1 2:0 0   1:1 2:0 0   1:1 2:0 0   1:1 2:0 0   2:0 0   1:1 2:0 0   1:255 2:0 0   1:1 2:0 0   1:1 2:0 0   1:1 2:0 0   1:1 2:0 0   1:1 2:0 0   1:1 2:0 0   1:1 2:0 0   1:1 2:0 0   1:1 2:0 0   2:0 0   1:1 2:0 0
if `false`; then :;   else false; echo foo;  fi; echo \ 2:$?   1   1   255   255   255   foo 2:0 0   1   1   1   1   1   1   1   2:0 0   foo 2:0 0   255   1   1   1   1   1   1   1   1   1   2:0 0   1
if    true; then false; echo foo;            fi; echo \ 2:$?   1   1   255   255   255   foo 2:0 0   1   1   1   1   1   1   1   1   foo 2:0 0   255   1   1   1   1   1   1   1   1   1   1   1
if  ! true; then false; echo foo;            fi; echo \ 2:$?  N/A 1  N/A 1  N/A0  N/A0  N/A0  N/A0  N/A0  N/A0   2:0 0   2:0 0   2:0 0   2:0 0   2:0 0   N/A 2   N/A 0   2:0 0   2:0 0   2:0 0   2:0 0   2:0 0   2:0 0   2:0 0   2:0 0   2:0 0   2:0 0   2:0 0   2:0 0
if  true;   then : `false`;                  fi; echo $?   1   1   255   255   255   1 0   1   0 0   0 0   0 0   0 0   0 0   0 0   0 0   0 0   0 0   0 0   0 0   0 0   0 0   0 0   0 0   0 0   0 0   0 0   0 0   0 0
if  true;   then : `false`; echo foo;        fi; echo \ $?   1   1   255   255   255   foo 0 0   1   foo 0 0   foo 0 0   foo 0 0   foo 0 0   foo 0 0   foo 0 0   foo 0 0   foo 0 0   foo 0 0   foo 0 0   foo 0 0   foo 0 0   foo 0 0   foo 0 0   foo 0 0   foo 0 0   foo 0 0   foo 0 0   foo 0 0   foo 0 0
echo `false; echo foo`; echo \ $?   1   1   255   255   255   1   0 0   0 0   0 0   0 0   0 0   0 0   0 0   0 0   foo 0 0   0 0   foo 0 0   foo 0 0   0 0   foo 0 0   0 0   0 0   foo 0 0   foo 0 0   foo 0 0   0 0   0 0
f() { false; echo foo;          }; f;              echo \ $?  N/A 2   1   255   255   255   1   1   1   1   1   1   1   1   1   foo 0 0   255   1   1   1   1   1   1   1   1   1   1   1
f() { false; echo foo;          }; f || echo foo2; echo \ $?  N/A 2   foo 0 0   foo 0 0   foo 0 0   foo 0 0   foo 0 0   foo 0 0   foo 0 0   foo 0 0   foo 0 0   foo 0 0   foo 0 0   foo 0 0   1   foo 0 0   foo 0 0   foo 0 0   foo 0 0   foo 0 0   foo 0 0   foo 0 0   1   foo 0 0   foo 0 0   foo 0 0   foo 0 0   foo 0 0
f() { false && false; echo foo; }; f;              echo \ $?  N/A 2   foo 0 0   foo 0 0   foo 0 0   foo 0 0   foo 0 0   foo 0 0   foo 0 0   foo 0 0   foo 0 0   foo 0 0   foo 0 0   foo 0 0   1   foo 0 0   foo 0 0   foo 0 0   foo 0 0   foo 0 0   foo 0 0   foo 0 0   foo 0 0   foo 0 0   foo 0 0   foo 0 0   foo 0 0   foo 0 0
f() { false && true ;           }; f;              echo \ $?  N/A 2   1 0   255 0   255 0   255 0   1   1   1   1   1   1   1   1   1   1 0   255   1   1   1   1   1   1   1   1   1   1 0   1 0
f() { false && false;           }; f;              echo \ $?  N/A 2   1 0   255 0   255 0   255 0   1   1   1   1   1   1   1   1   1   1 0   255   1   1   1   1   1   1   1   1   1   1 0   1 0
f() { false && true;            }; eval f;         echo \ $?  N/A 2   1 0   255 0   255 0   255 0   1   1   1   1   1   1   1   1   1   0 0   255   1   1   1   1   1   1   1   1   1   1 0   1 0
f() { false && false;           }; eval f;         echo \ $?  N/A 2   1 0   255 0   255 0   255 0   1   1   1   1   1   1   1   1   1   0 0   255   1   1   1   1   1   1   1   1   1   1 0   1 0
eval 'false && true; echo foo'; echo \ $?   1   foo 0 0   255 0   255 0   255 0   foo 0 0   foo 0 0   1   1   1   foo 0 0   foo 0 0   foo 0 0   1   foo 0 0   255   foo 0 0   foo 0 0   foo 0 0   foo 0 0   foo 0 0   foo 0 0   foo 0 0   foo 0 0   foo 0 0   1 0   foo 0 0
. ./to_source; echo $? # to_source: "false && true"   1   1 0   255 0   255 0   255 0   1   1   1   1   1   1   1   1   1   0 0   255   1   1   1   1   1   1   1   1   1   1 0   1 0
trap echo\ \$\? 0; (exit 2); exit 1   0 0   0 0   0 0   2 0   2 2   2 2   2 2   2 2   2 2   0 2   2 2   2 2   1 1   2 2   21 0   1 1   0 139   1 1   1 1   2 2   2 2   2 2   1 1   1 1   2 2   2 2   2 2
commandline V7-sh $? SVR2
sh
ultrix
$? SVR3
sh
sun413
$? SVR4
sh
sun5.1
$? SVR4
sh
sun5.10
$? ksh86a
ep/ix
$? ksh88d
ep/ix
$? ksh88g
sun53
$? ksh88i
sun5.9
$? ksh93
-k
$? ksh93
-t
$? pdksh
-5.2.14
$? posh-
0.6.17
$? hist.
ash
$? bash-
1.05
$? bash-
1.14.0
$? bash-
1.14.7
$? bash-
3.2.48
$? bash-
3.2.48
--posix
$? bash-
4.0.35
$? bash-
4.0.35
--posix
$? dash-
0.3.4
$? dash-
0.3.8
$? dash-
0.5.5.1
$? dash-
0.5.5.1
-4
$? zsh-
3.0.8
$? zsh-
4.3.9
$?

About the table:


Here is a table with results for the tests suggested by D. Korn on the austin-list.

commandline V7-sh $? svr2-sh
ultrix
$? svr3-sh
sun-413
$? svr4-sh
sun-5.1
$? svr4-sh
sun-5.10
$? ksh86a
ep/ix
$? ksh88d
ep/ix
$? ksh88g
sun-53
$? ksh88i-
sun-5.9
$? ksh93-k $? ksh93-t $? pdksh-
5.2.14
$? posh-
0.6.17
$? hist.
ash
$? bash-
1.14.0
$? bash-
1.14.7
$? bash-
4.0.35
$? bash-
4.0.35
--posix
$? dash-
0.3.4
$? dash-
0.3.8
$? dash-
0.5.5.1
$? dash-
0.5.5.1
-4
$? zsh-
4.3.9
$?
$SHELL -ec "false;true" && echo "1"   1   1   255   255   255   1   1   1   1   1   1   1   1   1   255   1   1   1   1   1   1   1   1
$SHELL -ec "! true;true" && echo "2"  N/A 1  N/A 1  N/A1  N/A1  N/A1  N/A 1  N/A 1  N/A1   2 0   2 0   2 0   1   1   N/A 2   2 0   2 0   2 0   2 0   1   2 0   2 0   2 0   1
$SHELL -ec "if false;false;then true;fi" || echo "3"   1   0   0   0   3 0   0   0   0   0   0   0   0   0   3 0   0   0   0   0   3 0   0   0   0   0
$SHELL -ec "if false;then echo bar3;elif false;then true;fi" || echo "4"   1   0   0   0   0   0   0   0   0   0   0   0   0   4 0   0   0   0   0   0   0   0   0   0
$SHELL -ec "while false; true;do break;done" || echo "5"   1   0   0   0   0   0   0   0   0   0   0   0   0   5 0   0   0   0   0   5 0   0   0   0   0
$SHELL -ec "until false;do break;done" || echo "6"   1   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0
$SHELL -ec "until ! true ;do break;done" || echo "7"  N/A 1  N/A 0  N/A0  N/A0  N/A0  N/A 0  N/A 0  N/A0   0   0   0   0   0   N/A 0   0   0   0   0   0   0   0   0   0
$SHELL -ec "false || true" || echo "8"   1   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0
$SHELL -ec "false || false" && echo "9"   1   1   255   255   255   1   1   1   1   1   1   1   1   1   255   1   1   1   1   1   1   1   1
$SHELL -ec "false || { false;true;}" && echo "10"   1   1   255   255   255   10 0   1   1   1   1   1   1   1   1   255   1   1   1   1   1   1   1   1
$SHELL -ec "{ false;true;} || { false;true;}" || echo "11"   1   0   0   0   0   0   0   0   0   0   0   0   0   11 0   0   0   0   0   11 0   0   0   0   0
$SHELL -ec "(false);true" && echo "12"   1   1   255   255   255   1   1   1   1   1   1   1   12 0   1   12 0   139   1   1   1   12 0   12 0   1   1
$SHELL -ec "exec 2>/dev/null;true > .;true" || echo "13"   sh-v7-vladov: .: cannot open 1   13 0   13 0   13 0   13 0   13 0   13 0   13 0   13 0   13 0   13 0   13 0   13 0   13 0   13 0   13 0   13 0   13 0   13 0   13 0   13 0   13 0   13 0
$SHELL -ec "false | true" || echo "14"   1   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0
$SHELL -ec "true | false" && echo "15"   1   1   255   255   255   1   1   1   1   1   1   1   1   1   255   1   1   1   1   1   1   1   1
$SHELL -ec "while true;do false;break;done" && echo "16"   1   1   255   255   255   16 0   1   1   1   1   1   1   1   1   255   1   1   1   1   1   1   1   1
$SHELL -ec "f(){ false;};f" && echo "17"  N/A 2   1   255   255   255   1   1   1   1   1   1   1   1   1   255   1   1   1   1   1   1   1   1
$SHELL -ec "f()(false);f" && echo "18"  N/A 2   1   255   255   255  N/A 2   1   1   1   1   1   1   1   1  N/A1  N/A 1   1   1   1   1   1   1   1
$SHELL -ec "f(){ false;true;};f" && echo "19"  N/A 2   1   255   255   255   1   1   1   1   1   1   1   1   1   255   1   1   1   1   1   1   1   1
$SHELL -ec "f()(false;true);f" && echo "20"  N/A 2   1   255   255   255  N/A 2   1   1   1   1   1   1   1   1  N/A1  N/A 1   1   1   1   1   1   1   1
$SHELL -ec "f(){ false;true;};f && true" || echo "21"  N/A 2   0   0   0   0   0   0   0   0   0   0   0   0   21 0   0   0   0   0   21 0   0   0   0   0
$SHELL -ec "f()( false;true);f && true" || echo "22"  N/A 2   0   0   0   0  N/A 0   0   0   0   0   0   0   0   22 0  N/A0  N/A 0   0   0   22 0   0   0   0   0
$SHELL -ec "f(){ set -e;false;true;};f && true" || echo "23"  N/A 2   0   0   0   23 0   0   0   0   0   0   0   0   0   23 0   0   0   0   0   23 0   0   0   0   0
$SHELL -ec "f()( set -e;false;true);f && true" || echo "24"  N/A 2   0   0   0   24 0  N/A 0   0   0   0   0   0   0   0   24 0  N/A0  N/A 0   0   0   24 0   0   0   0   0
[ "$($SHELL -ec "{ false;echo foo;} | cat")" = '' ] || echo "25"  N/A 2  N/A 2  N/A2  N/A2  N/A2   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0
[ "$($SHELL -ec "f(){ false;echo foo;}; f | cat")" = '' ] || echo "26"  N/A 2  N/A 2  N/A2  N/A2  N/A2   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0
[ "$($SHELL -ec "f()(false;echo foo); f | cat")" = '' ] || echo "27"  N/A 2  N/A 2  N/A2  N/A2  N/A2  N/A 0   0   0   0   0   0   0   0   0  N/A0  N/A 0   0   0   0   0   0   0   0
$SHELL -ec "! true | false" || echo "28"  N/A 1  N/A 0  N/A0  N/A0  N/A0  N/A 0  N/A 0  N/A0   0   0   0   0   0   N/A 0   28 0   28 0   0   0   28 0   0   0   0   0
$SHELL -ec "! true | true;true" && echo "29"  N/A 1  N/A 0  N/A0  N/A0  N/A0  N/A 0  N/A 0  N/A0   29 0   29 0   29 0   1   1   N/A 0   29 0   29 0   29 0   29 0   29 0   29 0   29 0   29 0   1
$SHELL -ec "! { true | true;};true" && echo "30"  N/A 2  N/A 2  N/A2  N/A2  N/A2  N/A 2  N/A 2  N/A2   30 0   30 0   30 0   1   1   N/A 2   30 0   30 0   30 0   30 0   1   30 0   30 0   30 0   1
$SHELL -ec "true | { false;};true" && echo "31"   1   1   255   255   255   1   31 0   1   1   1   1   1   1   1   31 0   139   1   1   1   1   1   1   1
commandline V7-sh $? svr2-sh
ultrix
$? svr3-sh
sun-413
$? svr4-sh
sun-5.1
$? svr4-sh
sun-5.10
$? ksh86a
ep/ix
$? ksh88d
ep/ix
$? ksh88g
sun-53
$? ksh88i-
sun-5.9
$? ksh93-k $? ksh93-t $? pdksh-
5.2.14
$? posh-
0.6.17
$? hist.
ash
$? bash-
1.14.0
$? bash-
1.14.7
$? bash-
4.0.35
$? bash-
4.0.35
--posix
$? dash-
0.3.4
$? dash-
0.3.8
$? dash-
0.5.5.1
$? dash-
0.5.5.1
-4
$? zsh-
4.3.9
$?


Comments to <mascheck@in-ulm.de>
<http://www.in-ulm.de/~mascheck/various/set-e/>