長い作業をしているシェルスクリプトをうっかりCtrl-Cしてしまって悲しい思いをすることはよくあります。
簡単な対処法としてSIGINTを無視するtrap '' 2をスクリプトに加えるというものがありますが、
常に無視されるというのも本当に終了させたいときに手間なものです。(Ctrl-Zでサスペンドしてkill -9など)
そこで、一度Ctrl-Cを押すと本当に終了して良いか質問した上で終了/続行するスクリプトを使ってみます。
(1/26 複数のシグナルを指定すると狂うバグがあったので修正しました)
以下、sigconfirm.sh
#!/bin/bash
# trap handler
function traphandler() {
# disable SIG* inside this handler
trap '' $@
echo -n "Are you sure to quit? [y/n] "
read c
if [ "${c/Y/y}x" == 'yx' ]; then echo 'quit'; exit 1; fi
echo 'continue.'
trap "traphandler $*" $@
}
# register trap handler for SIG*
trap "traphandler $*" $@これを自分のスクリプトでsourceすると、
#!/bin/bash source sigconfirm.sh 2 while :; do echo ':'; sleep 1; done
(引数2は補足するシグナルの種類。source sigconfirm.h 1 2 3 15 のように複数指定できます)
以下のようになります。
$ ./testsigconfirm.sh : : ^CAre you sure to quit? [y/n] n : : ^CAre you sure to quit? [y/n] y $
普通にtrapした場合、trap内部の処理中にまたCtrl-Cが押されると終了してしまうのですが、ここではハンドラの内部ではSIGINTを無視するように設定しているため、Ctrl-Cをうっかり連打してしまっても落としてしまうことがありません。

No Comments yet »
コメント RSS TrackBack URI
コメントをどうぞ