La ejecución (exit 1);
es la forma más sencilla de activar una ERR
trampa. También activará la salida inmediata si set -e
está vigente. (La activación de la condición de error requiere que falle un comando; exit
con un valor de falla en una subshell, la subshell falla).
exit 1;
no hará ninguna de esas cosas.
Por {(exit 1); exit 1;}
lo tanto, se puede usar para producir primero la ERR
trampa, que podría hacer algo útil para fines de depuración, y luego terminar el script con una indicación de error.
Pero eso no es lo que está sucediendo en los autoconf
archivos. autoconf
los scripts se basan en la EXIT
trampa para limpiar los archivos temporales creados durante la ejecución. La mayoría de los shells, incluidos bash
, establecerán el estado del valor proporcionado en el exit
comando antes de llamar a la EXIT
trampa. Eso podría permitir que la EXIT
trampa detecte si se invocó por un error o por una terminación normal, y también le permite asegurarse de que el estado de salida esté configurado correctamente al final de la operación de captura.
Sin embargo, aparentemente algunos depósitos no cooperan. Aquí hay una cita del autoconf
manual :
Algunos scripts de shell, como los generados por autoconf
, usan una trampa para limpiar antes de salir. Si el último comando de shell salió con un estado distinto de cero, la trampa también sale con un estado distinto de cero para que el invocador pueda decir que se produjo un error.
Desafortunadamente, en algunos shells, como Solaris /bin/sh
, una trampa de salida ignora el argumento del comando de salida. En estos shells, una trampa no puede determinar si fue invocada por la salida simple o por la salida 1. En lugar de llamar a exit directamente, use la AC_MSG_ERROR
macro que tiene una solución para este problema.
La solución es asegurarse de que $?
tenga el estado de salida antes deexit
ejecutar el comando, para que definitivamente tenga ese valor cuando EXIT
se ejecute la captura. Y, de hecho, es la AC_MSG_ERROR
macro la que inserta ese curioso código, completo con llaves redundantes.
false
lugar de(exit 1)
?