L'esecuzione (exit 1);
è il modo più semplice di innescare una ERR
trappola. Inoltre attiverà l'uscita immediata se set -e
è attiva. (L'attivazione della condizione di errore richiede il fallimento di un comando; exit
con un valore di errore in una subshell si verifica un errore della subshell.)
exit 1;
non farà nessuna di queste cose.
Quindi {(exit 1); exit 1;}
può essere utilizzato per produrre prima la ERR
trap, che potrebbe fare qualcosa di utile per scopi di debug, quindi terminare lo script con un'indicazione di errore.
Ma non è quello che succede nei autoconf
file. autoconf
gli script si basano sulla EXIT
trap per ripulire i file temporanei creati durante l'esecuzione. La maggior parte delle shell, incluso bash
imposterà lo stato dal valore fornito nel exit
comando prima di chiamare la EXIT
trap. Ciò potrebbe consentire alla EXIT
trap di rilevare se è stata invocata da un errore o da una normale terminazione e inoltre consente di assicurarsi che lo stato di uscita sia impostato correttamente alla fine dell'operazione trap.
Tuttavia, a quanto pare alcune shell non cooperano. Ecco una citazione dal autoconf
manuale :
Alcuni script di shell, come quelli generati da autoconf
, usano una trap per ripulire prima di uscire. Se l'ultimo comando della shell è uscito con stato diverso da zero, anche la trap esce con stato diverso da zero in modo che l'invocatore possa dire che si è verificato un errore.
Sfortunatamente, in alcune shell, come Solaris /bin/sh
, una trap di uscita ignora l'argomento del comando exit. In queste shell, una trap non può determinare se è stata invocata dalla semplice uscita o dall'uscita 1. Invece di chiamare direttamente exit, utilizzare la AC_MSG_ERROR
macro con una soluzione alternativa per questo problema.
La soluzione alternativa è assicurarsi che $?
abbia lo stato di uscita primaexit
dell'esecuzione del comando, in modo che abbia sicuramente quel valore quando EXIT
viene eseguita la trap. E, in effetti, è la AC_MSG_ERROR
macro che inserisce quel codice curioso, completo di parentesi graffe ridondanti.
false
anziché(exit 1)
?