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
-ewhile executing in a context where-eis ignored, that setting will not have any effect until the compound command or the command containing the function call completes.