Widziałem to zachowanie w bash w wersji 3.2.51 zarówno na SuSE 11.3 i Mac OS przed El Capitan. Bash 3.2.57 na El Capitan ma "poprawne" zachowanie, np. Bash 4.
Jednak, obejście proponowane powyżej, dodanie "|| exit $?" po zamykającym okienku podpowaty, pokonuje intencję flagi -e bez względu na wersję basha. Z man bash:
-e Zakończ natychmiast jeśli polecenie proste (zobacz GRAMATYKA POWŁOKI powyżej) wyjście z niezerowym. Powłoka nie zostanie zakończona, jeśli polecenie, które się nie powiedzie, jest częścią listy poleceń bezpośrednio po chwili lub dopóki słowo kluczowe, część testu w instrukcji if, nie będzie częścią & & lub || lista, ...
Podpatka, a następnie "|| exit $?" najwyraźniej liczy się jako lista poleceń; a flaga bash -e nie będzie stosować się do polecenia ANY wewnątrz podpowłoki. Spróbuj go:
$ 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
$
Ponieważ podpowłoki następuje ||, że „echo po błędzie” jest prowadzony, nawet przy ustawionej -e. Co więcej, podpowłodzenie kończy 0, ponieważ to "echo" działało. Więc "|| exit $?" nawet nie uruchomi "wyjścia". Prawdopodobnie nie tego chcieliśmy!
O ile mi wiadomo, następująca formuła jest zgodna z wersjami bash, niezależnie od tego, czy honorują bash -e po subshell, czy nie. To nawet zachowuje się poprawnie, jeśli -e flag dzieje się zresetować:
Dodaj następujący wiersz bezpośrednio po nawiasie zamykającym każdej podpowłoce w skrypcie bash:
case $?/$- in (0/*) ;; (*/*e*) exit $? ;; esaC# honor bash -e flag when subshell returns
Czy jest jakaś szansa na wszystko możesz zaktualizować swoją wersję bash, ponieważ ten dokładny skrypt działa zgodnie z przeznaczeniem w 4.1.5. Być może to twoja "fałszywa" wersja –