Bash get exit status of command when 'set -e' is active?

From the bash manual:

The shell does not exit if the command that fails is [...] part of any command executed in a && or || list [...].

So, just do:

#!/bin/bash

set -eu

foo() {
  # exit code will be 0, 1, or 2
  return $(( RANDOM % 3 ))
}

ret=0
foo || ret=$?
echo "foo() exited with: $ret"

Example runs:

$ ./foo.sh
foo() exited with: 1
$ ./foo.sh
foo() exited with: 0
$ ./foo.sh
foo() exited with: 2

This is the canonical way of doing it.


as an alternative

ans=0
some-command || ans=$?

Maybe try running the commands in question in a subshell, like this?

res=$(some-command > /dev/null; echo $?)