la ERR
trap non deve eseguire il codice quando la shell stessa esce con un codice di errore diverso da zero, ma quando qualsiasi comando eseguito da quella shell che non fa parte di una condizione (come in if cmd...
, o cmd || ...
...) termina con un valore diverso da zero stato di uscita (stesse condizioni di ciò che provoca set -e
l'uscita dalla shell).
Se si desidera eseguire il codice all'uscita della shell con stato di uscita diverso da zero, è necessario aggiungere una trap EXIT
e verificare $?
lì:
trap '[ "$?" -eq 0 ] || echo hi' EXIT
Si noti tuttavia che su un segnale in trappola, verrebbero eseguite sia la trappola del segnale sia la trappola EXIT, quindi si consiglia di farlo come segue:
unset killed_by
trap 'killed_by=INT;exit' INT
trap 'killed_by=TERM;exit' TERM
trap '
ret=$?
if [ -n "$killed_by" ]; then
echo >&2 "Ouch! Killed by $killed_by"
exit 1
elif [ "$ret" -ne 0 ]; then
echo >&2 "Died with error code $ret"
fi' EXIT
O per utilizzare lo stato di uscita come $((signum + 128))
sui segnali:
for sig in INT TERM HUP; do
trap "exit $((128 + $(kill -l "$sig")))" "$sig"
done
trap '
ret=$?
[ "$ret" -eq 0 ] || echo >&2 "Bye: $ret"' EXIT
Si noti tuttavia che uscire normalmente da SIGINT o SIGQUIT ha potenziali effetti collaterali fastidiosi quando il processo genitore è una shell del genere bash
che implementa l' attesa e la gestione cooperativa dell'uscita dell'interrupt di terminale. Quindi, potresti voler assicurarti di ucciderti con lo stesso segnale invece di riferire al tuo genitore che sei stato effettivamente interrotto e che dovrebbe prendere in considerazione di uscire anche se ha ricevuto un SIGINT / SIGQUIT.
unset killed_by
for sig in INT QUIT TERM HUP; do
trap "exit $((128 + $(kill -l "$sig"))); killed_by=$sig" "$sig"
done
trap '
ret=$?
[ "$ret" -eq 0 ] || echo >&2 "Bye: $ret"
if [ -n "$killed_by" ]; then
trap - "$killed_by" # reset handler
# ulimit -c 0 # possibly disable core dumps
kill -s "$killed_by" "$$"
else
exec "$ret"
fi' EXIT
Se vuoi che la ERR
trap si attivi, esegui un comando con uno stato di uscita diverso da zero come false
o test
.