Why does bash not stop on error for failures in sequence of short-circuited commands?
The logic here is that your use of &&
already is error-checking. The same way bash doesn't treat a failure within an if
condition as worth aborting, even with set -e
.
When you wrap the commands in a parenthesis, you are actually running those commands within a subshell, so the script itself only sees the return of that subshell, ie: it isn't aware that &&
is involved at all, so it aborts as you expect.
Quoth the reference manual:
The shell does not exit if the command that fails is part of the command list immediately following a while or until keyword, part of the test in an if statement, part of any command executed in a && or || list except the command following the final && or ||, any command in a pipeline but the last, or if the command’s return status is being inverted with !