trapは、シグナル発生時に実行するコマンドを登録・解除する。
trap 〔コマンド〕 シグナル…
trapは、Javaのtry〜catch〜finallyのようなもの。
すなわち、シェル内でシグナルが発生したときに実行するコマンドを登録する(catch相当)。
シグナルにEXITを指定すると、シェル終了時に実行するコマンドを登録できる(finally相当)。
シグナルには「kill -l」で表示されるシグナル(強制終了であるKILLを除く)を指定できる。
シグナルは複数指定可能。
trapの引数にコマンドを指定しないと、トラップ解除になる。
EXITを解除しないと、シェルの末尾まで実行して正常終了する際にも、登録されたコマンドが実行される。
#!/bin/bash
function finally() {
echo finally
}
echo start
trap finally EXIT # 終了時にfinally関数を呼ぶ
ls /tmptmp
if [ $? != 0 ]; then
echo error
exit 1 # ここでfinally関数が呼ばれる
fi
trap EXIT # 終了時トラップを解除
echo end
set -eによって、各コマンドの戻り値が0以外でシェル全体が終了する場合でも、「trap コマンド EXIT」によって指定されたコマンドが実行される。
「trap コマンド EXIT」によって指定されたコマンド(関数)内に「exit 終了コード」がある場合、シェル全体はその終了コードで終了する。
exitが無い場合は、コマンドが呼ばれる前の終了コードがそのまま返される。
#!/bin/bash trap finally EXIT # 終了時にfinally関数を呼ぶ function finally() { echo finally exit 99 } exit 123