Refinando a última resposta, porque tem problemas:
# Our general exit handler
cleanup() {
err=$?
echo "Cleaning stuff up..."
trap '' EXIT INT TERM
exit $err
}
sig_cleanup() {
trap '' EXIT # some shells will call EXIT after the INT handler
false # sets $?
cleanup
}
trap cleanup EXIT
trap sig_cleanup INT QUIT TERM
Pontos acima:
Os manipuladores INT e TERM não param para mim quando eu testo - eles lidam com o erro e o shell retorna para a saída (e isso não é muito surpreendente). Então eu garanto que a limpeza sai depois, e no caso dos sinais sempre usa um código de erro (e no outro caso de uma saída normal, preserva o código de erro).
Com o bash, parece que sair no manipulador INT também chama o manipulador EXIT, portanto, eu desalojo o manipulador de saída e o chamo sozinho (que funcionará em qualquer shell, independentemente do comportamento).
Eu aprisionei a saída porque os scripts de shell podem sair antes de chegarem à parte inferior - erros de sintaxe, set -e e um retorno diferente de zero, simplesmente chamando exit. Você não pode confiar em um shellscript chegando ao fundo.
SIGQUIT é Ctrl- \ se você nunca tentou. Obtém um coredump bônus. Então eu acho que também vale a pena capturar, mesmo que seja um pouco obscuro.
A experiência passada diz que se você (como eu) sempre pressionar Ctrl-C várias vezes, às vezes você vai pegá-lo no meio da parte de limpeza do seu shell script, então isso funciona, mas nem sempre é tão perfeito quanto você gostaria .