Ho visto questo comportamento in bash versione 3.2.51 su SuSE 11.3 e Mac OS precedente a El Capitan. Bash 3.2.57 su El Capitan ha il comportamento "corretto", ad esempio bash 4.
Tuttavia, la soluzione proposta sopra, aggiungendo "|| exit $?" dopo il paren di chiusura della sottoshell, sconfigge l'intento della bandiera -e indipendentemente dalla versione di bash. Da man bash:
Exit -e immediatamente se un comando semplice (si veda GRAMMATICA DELLA SHELL sopra) termina con uno stato diverso da zero. La shell non esce se il comando che fallisce è parte dell'elenco comandi immediatamente dopo un po 'o fino alla parola chiave, parte del test in un'istruzione if, parte di uno & & o || lista, ...
Una sottoshell seguita da "|| exit $?" apparentemente conta come una lista di comandi; e il flag bash -e non si applica a QUALSIASI comando all'interno della sottoshell. Provalo:
$ set -e
$ (echo before the error; false; echo after the error, status $?;) || echo after the subshell, status $?
before the error
after the error, status 1
$
Perché la subshell è seguito da ||, che "eco dopo l'errore" viene eseguito, anche con set -e. Non solo, la subshell esce da 0, perché "echo" ha funzionato. Quindi "|| exit $?" non avrebbe nemmeno eseguito "l'uscita". Probabilmente non quello che volevamo!
Per quanto ne so, la seguente formula è compatibile con le versioni bash sia che rispettino bash -e dopo subshell, oppure no. Si comporta anche correttamente se il flag -e sembra essere resettare:
Aggiungere la seguente riga immediatamente dopo la parentesi di chiusura di ogni subshell nello script bash:
case $?/$- in (0/*) ;; (*/*e*) exit $? ;; esaC# honor bash -e flag when subshell returns
C'è qualche possibilità di tutto ciò che è possibile aggiornare la tua versione bash, perché questo script esatto funziona come previsto in 4.1.5. Forse è la tua versione 'false' –