けっこう便利な trap コマンドなんて知らなかった

あんまりシェルスクリプトは好きじゃないんだけど
インフラやってるとシェルスクリプトを書くことがある。

その中で他人が書いたコマンドに
trap というコマンドがあった。

罠…??

なんかおどろおどろしい感じがしたけど
調べてみると、なんとまあ便利なコマンドだことと感心した。

ざっくり用途

簡単に言えば、シェルが終了、中断したときに自動で実行する処理を登録するコマンド。

例えばシェルスクリプトの中で一時tmpファイルを作って
ファイルをダウンロードをしてたとしよう。

正常に終われば、最後らへんにrm で消せばいいけど
ctrl + c でやめちゃったら、tmpファイルは残ることになる。

tmpフォルダが残ったまま、再度実行すると
なんかしらエラーが起きるのはあるあるだ。

それを、削除処理とctrl + cのシグナルをtrapで設定しとけば
ctrl + cで終了してもtmpフォルダの削除を自動でやっといてくれる。

ここの説明が詳しい。
qiita.com

ssh のログインでやっぱりやーめたって、あーあるあるだなと思った。

使い方

trap 'コマンド' (シグナル番号)

使い方はこっちも詳しく書いてる。
shellscript.sunone.me

こんなスクリプト書いてみた

cat trap_test.sh
-----
mkdir aaaaa

trap "rm -rf ./aaaaa" EXIT

sleep 5

echo "===== file list ====="
ls -l

ふつーに実行してみると

### 最初に aaaaa なんてフォルダはないよ
$ ll
合計 4
-rw-rw-r-- 1 hoge hoge 85 1214 13:54 2017 trap_test.sh


### シェルスクリプトで aaaaa フォルダ作って
### sleepしてる間にls -l してみた
$ sh trap_test.sh
===== file list =====
合計 8
drwxrwxr-x 2 hoge hoge  4096 1214 14:09 2017 aaaaa
-rw-rw-r-- 1 hoge  hoge    85 1214 13:54 2017 trap_test.sh

### シェルが終わったからtrapで aaaaa フォルダ削除されてる
$ ll
合計 4
-rw-rw-r-- 1 hoge hoge 85 1214 13:54 2017 trap_test.sh

これを sleep中に ctrl + c する。

### 最初に aaaaa なんてフォルダはないよ
$ ll
合計 4
-rw-rw-r-- 1 hoge hoge 85 1214 13:54 2017 trap_test.sh

### sleep中にctrl + c して中止
$ sh trap_test.sh

### aaaaa フォルダがちゃんと消されてる
$ ll
合計 4
-rw-rw-r-- 1 hoge hoge 85 1214 13:54 2017 trap_test.sh


便利だねー