tech-userlevel archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

Re: set -e again



On Wed, 14 Jan 2026, David Holland wrote:

  set -e
  f() {
      echo foo
      false
      echo bar
  }
  f || echo baz
  echo buzz

prints "foo", "bar", "buzz", and continues. Furthermore, all the
shells I have in easy reach agree on it.

This seems wrong - the exit status of the f is guarded, but the false
is not. But also, the fact that everybody agrees makes me think it's
probably the agreed result of the last round of POSIX wrangling over
the -e definition some years back.

Is this intended, and is there a way to get the user's intended
behavior of exit on unchecked failure back? (E.g. is there a different
set to get functions to return on unchecked failure that might cover
this?)


There's a way, but, it a) involves running functions in a subshell, and b)
set +e/-e fiddling before/after each function:

```
set -e		# orig.
f() {
    set -e	# for func.
    echo foo
    false
    echo bar
}
set +e		# for every func.
(f); rc=$?
set -e
[ $rc -eq 0 ] || echo baz
echo buzz
```

-RVP


Home | Main Index | Thread Index | Old Index