Обработка сигналов с ловушкой
TRAPINT() {
echo "TRAPINT() called: ^C was pressed"
}
TRAPQUIT() {
echo "TRAPQUIT() called: ^\\ was pressed"
}
TRAPTERM() {
echo "TRAPTERM() called: a 'kill' command was aimed at this program's process ID"
}
TRAPEXIT() {
echo "TRAPEXIT() called: happens at the end of the script no matter what"
}
for i in {1..9}; do
echo ${i}
sleep 1
done
Для всех этих TRAP[NAL]()
функций, если последняя команда return 0
(или если вообще нет оператора возврата, выполнение кода будет продолжено там, где программа остановилась, как если бы сигнал был принят, перехвачен и обработан. Если состояние возврата этой функции не равно нулю, то состояние возврата прерывания сохраняется, и выполнение команды, которое ранее имело место, будет Вы можете сделать return $((128+$1))
, чтобы вернуть тот же статус, как если бы сигнал не был перехвачен
Относительно того, почему ваша оболочка убивается, это потому, что вызов kill -9 $$
отправит сигнал 9 на Идентификатор процесса, связанный с вашей оболочкой. Сигнал № 9 или SIGKILL
- это единственный сигнал, который не может быть обработан с помощью ловушек. Это своего рода «убийство последней инстанции», если программа действительно должна быть немедленно остановлена без очистки допускается.