選択された答えはbashism
であることに注意してください。これは、ソリューションを意味します
trap "{ rm -f $LOCKFILE }" EXIT
dash
は bash でのみ機能します ( shell がまたは classicの場合は Ctrl+c をキャッチしませんsh
) が、互換性が必要な場合でも、トラップするすべてのシグナルを列挙する必要があります。
また、スクリプトがシグナル「0」(別名 EXIT) のトラップを終了すると、コマンドが二重に実行されることにも注意してtrap
ください。
EXIT シグナルがある場合、すべてのシグナルを 1 行にスタックしない理由です。
それをよりよく理解するには、変更なしで異なるシステム間で機能する次のスクリプトを見てください。
#!/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 シグナル(終了の最終段階)でいくつかのコードを実行できます。