|
|
|
|
|
by twooster
1863 days ago
|
|
You should almost always be running Bash in `-e` (exit-on-error) mode. This necessitates precisely the construct mentioned in this article. For example: set -e
var="$( false )"
if [ $? -eq 0 ] ; then
echo Ok: "$var"
else
echo Not ok: $?
fi
If you run this program, neither "Ok" or "Not ok" will be echoed, because the program will exit with an error on the `var=` line. (Not to mention the $? on the not-ok line won't work because it will be the exit code of the `[` test command in the conditional, not the exit code of the captured subshell command).Instead the following will work: set -e
if var="$( false )" ; then
echo Ok: "$var"
else
echo Not ok: $?
fi
Note that this will _not_ work: if ! var="$( false )"; then
echo Not ok: $?
fi
Your output will be "Not ok: 0". This is because negation impacts the exit code of the previous command. |
|
This is a variant of the issue that the sibling comment brought up -- error handling is disabled inside "if" conditions.
In Oil the whole construct is unconditionally disabled by strict_errexit. It's too subtle.
Oil has 2 ways of capturing the exit code, including
and I'm looking for feedback to make sure that Oil has indeed fixed all of this stuff: https://www.oilshell.org/blog/2020/10/osh-features.htmlBasically the situation is "damned if you do and damned if you don't" in Bourne shell, so you need language/interpreter changes to really fix it. The rules are too tricky to remember even for shell experts -- there are persistent arguments on POSIX behavior that is over 20 years old, simply because it's so confusing.
https://github.com/oilshell/oil/wiki/Where-To-Send-Feedback