Executar (exit 1);é a maneira mais simples de acionar uma ERRarmadilha. Também acionará a saída imediata, se set -eestiver em vigor. (A ativação da condição de erro requer a falha de um comando; exitcom um valor de falha em um subshell faz com que o subshell falhe.)
exit 1; não fará nenhuma dessas coisas.
Portanto, {(exit 1); exit 1;}pode ser usado para produzir primeiro a ERRarmadilha, o que pode ser útil para fins de depuração e, em seguida, finalizar o script com uma indicação de erro.
Mas não é isso que está acontecendo nos autoconfarquivos. autoconfscripts dependem da EXITarmadilha para limpar arquivos temporários criados durante a execução. A maioria dos shells, inclusive bash, definirá o status a partir do valor fornecido no exitcomando antes de chamar a EXITarmadilha. Isso pode permitir que a EXITinterceptação detecte se foi invocada a partir de um erro ou da finalização normal e também garante que o status de saída seja definido corretamente no final da operação de interceptação.
No entanto, aparentemente algumas conchas não cooperam. Aqui está uma citação do autoconfmanual :
Alguns scripts de shell, como os gerados por autoconf, usam uma interceptação para limpar antes de sair. Se o último comando do shell sair com status diferente de zero, a interceptação também sairá com status diferente de zero, para que o invocador possa dizer que ocorreu um erro.
Infelizmente, em alguns shells, como o Solaris /bin/sh, uma armadilha de saída ignora o argumento do comando exit. Nessas shells, uma interceptação não pode determinar se foi invocada pela saída simples ou pela saída 1. Em vez de chamar exit diretamente, use a AC_MSG_ERRORmacro que possui uma solução alternativa para esse problema.
A solução alternativa é garantir que $?tenha o status de saída antes da exitexecução do comando, para que ele definitivamente tenha esse valor quando a EXITinterceptação for executada. E, de fato, é a AC_MSG_ERRORmacro que insere esse código curioso, completo com chaves redundantes.
falsevez de(exit 1)?