linux - Why doesn't set -e cause a failure with `false || false && true`? -


this question has answer here:

can't figure out fitting title, don't understand behavior in dash/bash. namely using set -e bail out if command fails, , command groups handle positive result.

ie. general scheme is:

[ ! wantcommand ] || command 

than means command gets executed if needed, , failure automatically kill script.

there might postprocessing necessary, in case use this:

[ ! wantcommand ] || { command && postprocess; } 

this has led curious bughunting, wont kill shell , cant behind reason. have go through chunks of shell code now, understand reason.

for testing:

bash -c 'set -e; { false || false && echo "post" ; }; echo "ec $?"' 

or:

bash -c 'set -e; { set -e; false || false && echo "post" ; }; echo "ec $?"' 

note: not asking fix, primary why returncode 1, shell wont quit

set -e bails on unchecked failures.

when branch on failure (using if, until, while, && or ||), failure checked.

if specification not written in manner, short-circuiting boolean operations not used flow control because false branches cause exit.


to quote the specification, emphasis added:

when option on, when command fails (for of reasons listed in consequences of shell errors or returning exit status greater zero), shell shall exit, if executing exit special built-in utility no arguments, following exceptions:

  1. the failure of individual command in multi-command pipeline shall not cause shell exit. failure of pipeline shall considered.

  2. the -e setting shall ignored when executing compound list following while, until, if, or elif reserved word, pipeline beginning ! reserved word, or any command of and-or list other last.

  3. if exit status of compound command other subshell command result of failure while -e being ignored, -e shall not apply command.

this requirement applies shell environment , each subshell environment separately. example, in:

set -e; (false; echo one) | cat; echo 2 

the false command causes subshell exit without executing echo one; however, echo two executed because exit status of pipeline (false; echo one) | cat zero.

note specification has changed on time; shells implementing prior revision of posix specification may not precisely comply version quoted here.


to inject opinion here -- i'd suggest reading bashfaq #105 , ensuring understand behaviors described therein before making decision use set -e rather implementing explicit error-handling hand. fvue wiki further describes distinctions in behavior between set -e in bash-native mode , posix mode, should likewise understood.


Comments

Popular posts from this blog

asynchronous - C# WinSCP .NET assembly: How to upload multiple files asynchronously -

aws api gateway - SerializationException in posting new Records via Dynamodb Proxy Service in API -

asp.net - Problems sending emails from forum -