Se eu usar trap
como descrito, por exemplo, em http://linuxcommand.org/wss0160.php#trap para capturar ctrl-c (ou similar) e limpeza antes de sair, estou alterando o código de saída retornado.
Agora, isso provavelmente não fará diferença no mundo real (por exemplo, porque os códigos de saída não são portáteis e, além disso, nem sempre são ambíguos, conforme discutido no Código de saída padrão quando o processo é finalizado? ), Mas ainda estou me perguntando se existe algum realmente não há como evitar isso e retornar o código de erro padrão para scripts interrompidos?
Exemplo (no bash, mas minha pergunta não deve ser considerada específica do bash):
#!/bin/bash
trap 'echo EXIT;' EXIT
read -p 'If you ctrl-c me now my return code will be the default for SIGTERM. ' _
trap 'echo SIGINT; exit 1;' INT
read -p 'If you ctrl-c me now my return code will be 1. ' _
Resultado:
$ ./test.sh # doing ctrl-c for 1st read
If you ctrl-c me now my return code will be the default for SIGTERM.
$ echo $?
130
$ ./test.sh # doing ctrl-c for 2nd read
If you ctrl-c me now my return code will be the default for SIGTERM.
If you ctrl-c me now my return code will be 1. SIGINT
EXIT
$ echo $?
1
(Editado para remover para torná-lo mais compatível com POSIX.)
(Editado novamente para torná-lo um script bash, minha pergunta não é específica do shell.)
Editado para usar o "INT" portátil para interceptar a favor do "SIGINT" não portátil.
Editado para remover chaves inúteis e adicionar uma solução em potencial.
Atualizar:
Eu o resolvi agora, simplesmente saindo com alguns códigos de erro codificados e capturando EXIT. Isso pode ser problemático em alguns sistemas, porque o código de erro pode ser diferente ou a armadilha EXIT não é possível, mas no meu caso está tudo bem.
trap cleanup EXIT
trap 'exit 129' HUP
trap 'exit 130' INT
trap 'exit 143' TERM
read -p
lê as entradas do coprocesso atual.
read
para ler o coprocesso atual etrap cmd SIGINT
não funcionará, pois o padrão diz que você deve usartrap cmd INT
.