Eu tenho um script bash e gostaria de adicionar a capacidade de capturar as condições EXIT e ERR. A estrutura está atualmente
trap cleanup EXIT
function notify(reason) {}
function build {}
function dbops {}
function deploy {}
function cleanup {}
notify('start') \
&& build \
&& dbops \
&& deploy \
&& notify('finished');
Qual é a maneira recomendada de adicionar uma armadilha para um erro e (opcionalmente) capturar o motivo da saída e enviá-lo por meio da função de notificação? No momento, tudo o que a limpeza faz é excluir o arquivo de bloqueio em EXIT.
Quero poder enviar uma notify(reason)
mensagem para o Slack se o script falhar inesperadamente, mas não enviá-la no EXIT normal.
Meu encadeamento de execução interferirá na captura adequada de erros?
Responder1
Você não pode detectar erros trap ... ERR
em comandos cujo código de saída foi testado. No seu caso específico, na página de manual do bash:
A armadilha ERR não será executada se o comando com falha for ... parte de um comando executado em um && ou || list, exceto o comando após o final && ...
De modo geral, a maneira mais simples de garantir a limpeza de um conjunto de funções é executá-las todas em um subshell e, independentemente de como ele sair, você ainda poderá fazer a limpeza.