Тільки майте на увазі, що обрана відповідь є bashism
, що означає рішення як
trap "{ rm -f $LOCKFILE }" EXIT
буде працювати тільки в bash (він не буде ловити Ctrl + c, якщо оболонка dash
або класичнаsh
), але якщо ви хочете сумісність, вам все одно потрібно перерахувати всі сигнали, які ви хочете затримати.
Також майте на увазі, що коли скрипт виходить із пастки для сигналу "0" (він же EXIT), завжди виконується, що призводить до подвійного виконання trap
команди.
Це причина не складати всі сигнали в один рядок, якщо є сигнал EXIT.
Щоб краще зрозуміти його, подивіться на наступний сценарій, який буде працювати в різних системах без змін:
#!/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
Це рішення надасть вам більший контроль, оскільки ви можете запустити частину коду при появі фактичного сигналу безпосередньо перед кінцевим виходом ( preExit
функцією), і якщо це потрібно, ви можете запустити деякий код на фактичному сигналі EXIT (кінцевий етап виходу)