理系学生日記

おまえはいつまで学生気分なのか

シェルスクリプトで trap を忘れちゃいませんか

trap ビルトイン、あんまし存在感ないし、いつも忘れられてるし不憫だとおもう。
trap、その名前の通り、スクリプト内で発生するシグナルをトラップして、指定した処理実行することできる。たとえば Ctrl-C 押したとき反応するみたいなの、こんなスクリプトで実現できる。

$ cat a.sh
#!/bin/bash
trap 'echo だるみ' SIGINT
sleep 300

$ ./a.sh
^Cだるみ

trap の最後の引数がシグナルなんだけど、trap は疑似シグナルとして ERR とか EXIT とか指定することできる。

  • EXIT: シェルスクリプト実行が終了したタイミングで実行される
  • ERR: どっかのコマンド実行がエラーになったときに実行される

EXIT を利用すると、シェルスクリプト実行の最後にだるいって出力できて、確実にだるさをアピールできるようになる。

$ cat b.sh
#!/bin/bash
trap 'echo だるい' EXIT
ls -a

$ ./b.sh
./    ../
だるい

ERR 指定すると、異常終了時にだるいって出力できて、マズいことが起こった場合に積極的にだるさをアピールできる。

$ cat c.sh
#!/bin/bash
trap 'echo だるい' ERR
ls not_exist_file
ls not_exist_file

./c.sh
ls: not_exist_file: No such file or directory
だるい
ls: not_exist_file: No such file or directory
だるい

というわけで、trap 非常に便利です。マジメなところでいうと、シェルスクリプトのロックファイル削除とか、そういうのに便利です。