vorfee's Tech Blog

Just another tech blog

シェルスクリプト内で一時ファイルを作成して終了時に削除する

trapコマンドを使うとさまざまなタイミングでファイルを操作できると知ったのでメモする。

以下の内容をファイルにして実行すると動作が確認できる。

#!/usr/bin/env sh

output=$(mktemp mytempfile_XXXXXX 2>/dev/null || exit 1)
trap "rm -f $output" 0 1 2 3

echo 'hoge' > $output
cat $output

echo '5秒間待機します...'
sleep 5

実行すると 5秒間待機します... と表示されストップする。ここで以下3つの操作を行ってもファイルが削除される。

  1. 5秒間待って正常に終わる(シグナル0)
  2. ターミナルのウインドウを閉じて終了させる(シグナル1, SIGHUP)
  3. Ctrl + cで終了させる(シグナル2, SIGINT)
  4. Ctrl + \で終了させる(シグナル3, SIGQUIT)

それぞれのシグナルの意味はWikipediaに載っている。

-> シグナル (ソフトウェア) - Wikipedia

trapコマンドの使い方は以下のページが良さそう。

-> http://shellscript.sunone.me/signal_and_trap.html

おまけ

これだけだと内容が少ないのでzshの話を絡める。

ある日突然Ctrl + cの動作が味気ないと思うかもしれない。そんな時は .zshrcに以下の関数を追加するといい。

TRAPINT() {
echo -n '(´;ω;`)ウッ…'
return $(( 128 + $1 ))
}

Ctrl + cを押した時に癒される。

詳細はzshのマニュアルにわかりやすく書いてある。

-> http://zsh.sourceforge.net/Doc/Release/Functions.html#index-trapping-signals

参照

LinuxCommand.org: Dialog http://linuxcommand.org/lc3_adv_dialog.php

Linuxシグナル入門 http://www.oki-osk.jp/esc/linux/signal.html

シグナル (ソフトウェア) - Wikipedia