Das Ausführen (exit 1);ist die einfachste Art, eine ERRFalle auszulösen . Es wird auch ein sofortiges Verlassen ausgelöst, wenn dies set -ewirksam ist. (Zum Auslösen der Fehlerbedingung muss ein Befehl fehlschlagen. exitWenn ein Fehlerwert in einer Subshell angegeben wird, schlägt die Subshell fehl.)
exit 1; wird keines dieser Dinge tun.
So {(exit 1); exit 1;}kann den zum ersten Produkten verwendet wird ERRFall, die für Debugging - Zwecke nützlich etwas tun könnte, und dann das Skript mit einer Fehleranzeige beenden.
Aber das ist nicht das, was in autoconfDateien vor sich geht. autoconfSkripte verlassen sich auf die EXITFalle, um temporäre Dateien zu bereinigen, die während des Laufs erstellt wurden. Die meisten Shells, einschließlich bash, setzen den Status anhand des im exitBefehl angegebenen Werts, bevor sie den EXITTrap aufrufen . Auf diese Weise kann der EXITTrap erkennen, ob er aufgrund eines Fehlers oder einer normalen Beendigung aufgerufen wurde, und er kann auch sicherstellen, dass der Beendigungsstatus am Ende des Trap-Vorgangs korrekt festgelegt ist.
Anscheinend arbeiten jedoch einige Muscheln nicht zusammen. Hier ist ein Zitat aus dem autoconfHandbuch :
Einige Shell-Skripte, beispielsweise die von generierten autoconf, bereinigen vor dem Beenden mit einem Trap. Wenn der letzte Shell-Befehl mit einem Status ungleich Null beendet wurde, wird der Trap auch mit einem Status ungleich Null beendet, sodass der Aufrufer feststellen kann, dass ein Fehler aufgetreten ist.
Leider /bin/shignoriert eine Exit-Trap in einigen Shells, wie z. B. Solaris , das Argument des Befehls exit. In diesen Shells kann ein Trap nicht feststellen, ob er durch einfaches Beenden oder durch Beenden von 1 aufgerufen wurde. Verwenden Sie den AC_MSG_ERRORMakro, der eine Problemumgehung für dieses Problem aufweist, anstatt Exit direkt aufzurufen .
Die Problemumgehung besteht darin, vor der Ausführung des Befehls sicherzustellen, dass $?dieser den Exit-Status hat , damit er bei der Ausführung des Traps definitiv diesen Wert hat . Und tatsächlich ist es das Makro, das diesen seltsamen Code mit redundanten Klammern einfügt.exitEXITAC_MSG_ERROR
falsestatt(exit 1)?