Wykonywanie (exit 1);jest najprostszym sposobem na uruchomienie ERRpułapki. Spowoduje również natychmiastowe wyjście, jeśli set -ejest aktywne. (Wywołanie warunku błędu wymaga wykonania komendy do niepowodzenia; exitwartość błędu w podpowłoce powoduje awarię podpowłoki).
exit 1; nie zrobi żadnej z tych rzeczy.
Więc {(exit 1); exit 1;}może być stosowany do pierwszego produkować ERRpułapkę, co może zrobić coś pożytecznego dla celów debugowania, a następnie wypowiedzieć skrypt ze wskazaniem błędów.
Ale nie o to chodzi w autoconfplikach. autoconfskrypty polegają na EXITpułapce w celu czyszczenia plików tymczasowych utworzonych podczas uruchamiania. Większość powłok, w tym bashustawia status na podstawie wartości podanej w exitpoleceniu przed wywołaniem EXITpułapki. To może pozwolić EXITpułapce na wykrycie, czy została wywołana na podstawie błędu, czy normalnego zakończenia, a także pozwala upewnić się, że status wyjścia jest poprawnie ustawiony na końcu operacji pułapki.
Jednak najwyraźniej niektóre pociski nie współpracują. Oto cytat z autoconfinstrukcji :
Niektóre skrypty powłoki, takie jak te generowane przez autoconf, używają pułapki do czyszczenia przed wyjściem. Jeśli ostatnia komenda powłoki została zakończona z niezerowym statusem, pułapka kończy się również ze statusem niezerowym, aby wywołujący mógł stwierdzić, że wystąpił błąd.
Niestety, w niektórych powłokach, takich jak Solaris /bin/sh, pułapka wyjścia ignoruje argument polecenia wyjścia. W tych powłokach pułapka nie może ustalić, czy została wywołana zwykłym wyjściem, czy wyjściem 1. Zamiast wywoływać wyjście bezpośrednio, użyj AC_MSG_ERRORmakra, które ma obejście tego problemu.
Obejściem tego problemu jest upewnienie się, że $?ma status wyjścia przed wykonaniem exitpolecenia, aby na pewno miał tę wartość po wykonaniu EXITpułapki. I rzeczywiście, to AC_MSG_ERRORmakro wstawia ten ciekawy kod wraz z redundantnymi nawiasami klamrowymi.
falsezamiast(exit 1)?