L'esecuzione (exit 1);è il modo più semplice di innescare una ERRtrappola. Inoltre attiverà l'uscita immediata se set -eè attiva. (L'attivazione della condizione di errore richiede il fallimento di un comando; exitcon 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 ERRtrap, 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 autoconffile. autoconfgli script si basano sulla EXITtrap per ripulire i file temporanei creati durante l'esecuzione. La maggior parte delle shell, incluso bashimposterà lo stato dal valore fornito nel exitcomando prima di chiamare la EXITtrap. Ciò potrebbe consentire alla EXITtrap 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 autoconfmanuale :
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_ERRORmacro 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 EXITviene eseguita la trap. E, in effetti, è la AC_MSG_ERRORmacro che inserisce quel codice curioso, completo di parentesi graffe ridondanti.
falseanziché(exit 1)?