Could someone explain please why the following simple script does not terminate on error status?
I would expect that false would return with error status and cause the script to stop as I use
set -e false && true echo $? echo Done
while this one does:
set -e false echo $? echo Done
Output is empty
Your expectation is incorrect, and a big reason why
set -e isn’t really recommended. There is a long list of exceptions (including
&&) to the rule that
set -e exits on a non-zero exit status, precisely because not all non-zero exit statuses indicate an error, but simply a negative result.
grep, for example, has a non-zero exit status simply to indicate that no match was found.
echo foo | grep bar && echo "Found bar" echo foo | grep bar || echo "bar not found"
The assumption is that if you are examining the exit status of a command for any reason (
&&, etc), then you are expecting the possibility of failure and it’s not an error if it does.
Answered By – chepner