Executar (exit 1);
é a maneira mais simples de acionar uma ERR
armadilha. Também acionará a saída imediata, se set -e
estiver em vigor. (A ativação da condição de erro requer a falha de um comando; exit
com 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 ERR
armadilha, 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 autoconf
arquivos. autoconf
scripts dependem da EXIT
armadilha 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 exit
comando antes de chamar a EXIT
armadilha. Isso pode permitir que a EXIT
interceptaçã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 autoconf
manual :
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_ERROR
macro que possui uma solução alternativa para esse problema.
A solução alternativa é garantir que $?
tenha o status de saída antes da exit
execução do comando, para que ele definitivamente tenha esse valor quando a EXIT
interceptação for executada. E, de fato, é a AC_MSG_ERROR
macro que insere esse código curioso, completo com chaves redundantes.
false
vez de(exit 1)
?