La secuencia de commands Bash continúa, aunque quiero que salga antes

Estar confundido acerca de esto por un time, aquí hay un script destilado que representa el problema:

#start # note that master does not exist, so this should fail, would like to exit on the next line git branch -D master || (echo "no master branch" && exit 1); git fetch origin && git checkout master && BRANCH=$(git rev-parse --abbrev-ref HEAD) if [[ "$BRANCH" != "master" ]]; then echo 'Aborting script because you are not on the right git branch (master).'; exit 1; fi echo "done" #end 

cuando ejecuto el script anterior, obtengo esta salida:

 error: branch 'master' not found. no master branch error: Your local changes to the following files would be overwritten by checkout: publish-to-NPM.sh Please, commit your changes or stash them before you can switch branches. Aborting Aborting script because you are not on the right git branch (master). 

Tenga en count que "hecho" no se repite, por lo que el script sale en la segunda llamada de salida 1. Pero, ¿por qué el script no sale en la primera llamada de salida 1? Tan confundido acerca de esto.

 git branch -D master || (echo "no master branch" && exit 1); 

está ejecutando el RHS del condicional en un entorno de subprocess. La salida sale de ese subprocess. Si desea salir del script principal, no lo ejecute en un subprocess. Es decir, escribe:

 git branch -D master || { echo "no master branch" && exit 1; } 

Bien seguro, llamas a exit dentro de la condición if que está disparando.

La salida finalizará el process actual en cualquier idioma, incluido bash (aunque si está enhebrando o bifurcando, se vuelve más complicado que eso, pero no parece que esté ejecutando algo al mismo time).