あんまりシェルスクリプトは好きじゃないんだけど
インフラやってるとシェルスクリプトを書くことがある。
その中で他人が書いたコマンドに
trap というコマンドがあった。
罠…??
なんかおどろおどろしい感じがしたけど
調べてみると、なんとまあ便利なコマンドだことと感心した。
ざっくり用途
簡単に言えば、シェルが終了、中断したときに自動で実行する処理を登録するコマンド。
例えばシェルスクリプトの中で一時tmpファイルを作って
ファイルをダウンロードをしてたとしよう。
正常に終われば、最後らへんにrm で消せばいいけど
ctrl + c でやめちゃったら、tmpファイルは残ることになる。
tmpフォルダが残ったまま、再度実行すると
なんかしらエラーが起きるのはあるあるだ。
それを、削除処理とctrl + cのシグナルをtrapで設定しとけば
ctrl + cで終了してもtmpフォルダの削除を自動でやっといてくれる。
ここの説明が詳しい。
qiita.com
ssh のログインでやっぱりやーめたって、あーあるあるだなと思った。
こんなスクリプト書いてみた
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 12月 14 13:54 2017 trap_test.sh ### シェルスクリプトで aaaaa フォルダ作って ### sleepしてる間にls -l してみた $ sh trap_test.sh ===== file list ===== 合計 8 drwxrwxr-x 2 hoge hoge 4096 12月 14 14:09 2017 aaaaa -rw-rw-r-- 1 hoge hoge 85 12月 14 13:54 2017 trap_test.sh ### シェルが終わったからtrapで aaaaa フォルダ削除されてる $ ll 合計 4 -rw-rw-r-- 1 hoge hoge 85 12月 14 13:54 2017 trap_test.sh
これを sleep中に ctrl + c する。
### 最初に aaaaa なんてフォルダはないよ $ ll 合計 4 -rw-rw-r-- 1 hoge hoge 85 12月 14 13:54 2017 trap_test.sh ### sleep中にctrl + c して中止 $ sh trap_test.sh ### aaaaa フォルダがちゃんと消されてる $ ll 合計 4 -rw-rw-r-- 1 hoge hoge 85 12月 14 13:54 2017 trap_test.sh
便利だねー
[改訂第3版]シェルスクリプト基本リファレンス ──#!/bin/shで、ここまでできる (WEB+DB PRESS plus)
- 作者: 山森丈範
- 出版社/メーカー: 技術評論社
- 発売日: 2017/01/20
- メディア: 単行本(ソフトカバー)
- この商品を含むブログ (1件) を見る
入門UNIXシェルプログラミング―シェルの基礎から学ぶUNIXの世界
- 作者: ブルース・ブリン,Bruce Blinn,山下哲典
- 出版社/メーカー: ソフトバンククリエイティブ
- 発売日: 2003/02
- メディア: 単行本
- 購入: 18人 クリック: 331回
- この商品を含むブログ (64件) を見る