La ejecución (exit 1);es la forma más sencilla de activar una ERRtrampa. También activará la salida inmediata si set -eestá vigente. (La activación de la condición de error requiere que falle un comando; exitcon 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 ERRtrampa, 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 autoconfarchivos. autoconflos scripts se basan en la EXITtrampa 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 exitcomando antes de llamar a la EXITtrampa. Eso podría permitir que la EXITtrampa 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 autoconfmanual :
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_ERRORmacro 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 EXITse ejecute la captura. Y, de hecho, es la AC_MSG_ERRORmacro la que inserta ese curioso código, completo con llaves redundantes.
falselugar de(exit 1)?