Que tal isso
worked=false
(
set -e
echo Starting subshell process
echo If this executes process is considered success
false
echo run if possible, but not an error if failed || true
)
[[ 0 -eq $? ]] && worked=true
echo "$worked"
O set -e
finaliza a sub-shell assim que um erro desprotegido é encontrado. A construção || true
protege uma instrução que pode falhar, onde você não quer que a subshell termine.
Se você quer apenas saber se a subshell foi bem sucedida, você pode dispensar totalmente a variável $worked
(
set -e
...
)
if [[ 0 -eq $? ]]
then
echo "Success"
fi
Observe que, se você quiser usar set -e
para interromper a execução no subshell assim que um comando falhar, não será possível usar uma construção como ( set -e; ... ) && worked=true
ou if ( set -e; ...); then ... fi
. Isso está documentado na página man de bash
, mas eu perdi a primeira vez:
If a compound command or shell function sets
-e
while executing in a context where-e
is ignored, that setting will not have any effect until the compound command or the command containing the function call completes.