Se uso trap
come descritto ad esempio su http://linuxcommand.org/wss0160.php#trap per catturare ctrl-c (o simile) e ripulire prima di uscire, sto cambiando il codice di uscita restituito.
Ora questo probabilmente non farà differenza nel mondo reale (ad esempio perché i codici di uscita non sono portatili e per di più non sempre inequivocabili come discusso in Codice di uscita predefinito quando il processo è terminato? ) Ma mi chiedo ancora se ci sia davvero nessun modo per impedirlo e restituire invece il codice di errore predefinito per gli script interrotti?
Esempio (in bash, ma la mia domanda non dovrebbe essere considerata specifica per 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. ' _
Produzione:
$ ./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
(Modificato per rimuovere per renderlo più conforme POSIX.)
(Modificato di nuovo per renderlo invece uno script bash, la mia domanda non è specifica della shell però.)
Modificato per utilizzare il "INT" portatile per trap a favore del "SIGINT" non portatile.
Modificato per rimuovere inutili parentesi graffe e aggiungere una potenziale soluzione.
Aggiornare:
L'ho risolto ora semplicemente uscendo con alcuni codici di errore hardcoded e intrappolando EXIT. Questo potrebbe essere problematico su alcuni sistemi perché il codice di errore potrebbe essere diverso o la trappola EXIT non è possibile, ma nel mio caso è abbastanza OK.
trap cleanup EXIT
trap 'exit 129' HUP
trap 'exit 130' INT
trap 'exit 143' TERM
read -p
legge l'input dal coprocesso corrente.
read
di leggere dal coprocesso corrente etrap cmd SIGINT
non funzionerà come lo standard dice che dovresti usaretrap cmd INT
.