Tieni presente che la risposta scelta è bashism
, che significa soluzione come
trap "{ rm -f $LOCKFILE }" EXIT
funzionerebbe solo in bash (non catturerà Ctrl + c se la shell è dash
o classica sh
), ma se vuoi la compatibilità, devi comunque enumerare tutti i segnali che vuoi intercettare.
Inoltre, tieni presente che quando lo script esce dalla trappola per il segnale "0" (noto anche come EXIT) viene sempre eseguita la doppia esecuzione del trap
comando.
Questo è il motivo per non impilare tutti i segnali in una riga se c'è il segnale di USCITA.
Per comprenderlo meglio, guarda il seguente script che funzionerà su diversi sistemi senza modifiche:
#!/bin/sh
on_exit() {
echo 'Cleaning up...(remove tmp files, etc)'
}
on_preExit() {
echo
echo 'Exiting...' # Runs just before actual exit,
# shell will execute EXIT(0) after finishing this function
# that we hook also in on_exit function
exit 2
}
trap on_exit EXIT # EXIT = 0
trap on_preExit HUP INT QUIT TERM STOP PWR # 1 2 3 15 30
sleep 3 # some actual code...
exit
Questa soluzione ti darà un maggiore controllo poiché puoi eseguire parte del tuo codice al verificarsi del segnale effettivo appena prima dell'uscita finale ( preExit
funzione) e, se necessario, puoi eseguire del codice al segnale di USCITA effettivo (fase finale di uscita)