選ばれた答えはbashism
であり、これは
trap "{ rm -f $LOCKFILE }" EXIT
bashでのみ機能します(shellがdash
または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シグナル(終了の最終段階)でコードを実行できます。