trap
は外部コマンドではなく、シェルの組み込みコマンドで、シェルスクリプトがシグナルを受信したときの動作を設定するもの。シグナルの種類には番号がついていて、番号ごとに受信したときに実行するスクリプトを設定できる。
例
# SIGINTを受信したときに interrupted と表示して終了するtrap "echo interrupted; exit 1" 2# またはtrap "echo interrupted; exit 1" INT
シグナルの番号ごとに微妙に癖があるものがある。また本物のシグナルの他に擬似シグナルというのもある。
bashでは、help trap
というふうにhelp
コマンドでシェルの組み込みコマンドのヘルプを表示できる。help
も組み込みコマンドである。残念ながらzshではできないみたい。
擬似シグナルEXIT
はスクリプトが終了するタイミングをトラップする。0
と書いてもよい。
trap
で指定するコードの中にexit
で終了コードを指定すれば、スクリプト全体のもともとの終了コードが上書きされて、それに変わる。
trap "echo trap0" EXIT# またはtrap "echo trap0" 0# => 終了コード: 0trap "echo trap0" 0exit 1# => 終了コード: 1trap "echo trap0; exit 2" 0# => 終了コード: 2trap "echo trap0; exit 2" 0exit 1# => 終了コード: 2
実行したコマンドの終了コードが0以外だったときをトラップできる。途中で実行したすべてのコマンドで0以外だったものをすべてトラップされる。擬似シグナルERR
はbash
独自の機能みたい。
コマンドすべてというわけではなく、if
文の条件式にあるコマンドは、0以外を返してもトラップしない。
例
#!/bin/bashtrap "echo err" ERRtest 1 = 2if test 1 = 2; then echo "message 1"fiecho "message 2"# 出力# err# message 2
trap
で指定するコードの中にexit
を入れれば、そこでスクリプトが終了する。
#!/bin/bashtrap "echo err; exit 1" ERRtest 1 = 2echo "message"# 出力# err