シェルスクリプトで、 ruby でいう ensure がやりたい


シェルスクリプトで、何が起ころうが基本的にスクリプトが終了する直前に実行してほしいコマンドがあるとします。今の具体的な想定としては、 mktemp
で作ったディレクトリの削除です。

シェルスクリプトは、通常であれば上から順番にコマンドを実行していき、最後に終了しますが、ぱっと思いつくかぎりでも、以下のケースで (スクリプトの途中で)
終了します。

  * exit コマンドの実行
  * sigint, sigterm などのシグナルの受信

これらの場合でも、適切に終了処理を実行してくれるシェルスクリプトは記述できますか？




[trap](http://www.gnu.org/software/bash/manual/html_node/Bourne-Shell-
Builtins.html#index-trap) で `EXIT` のハンドラを書けばよいと思います。次のようなスクリプトでテストしてみてください。

[code]

    #!/bin/bash
    TMPDIR=$(mktemp -d)
    trap "rm -rf $TMPDIR" EXIT
    echo "Created $TMPDIR"
    read a
    
[/code]

実行すると `Created /tmp/tmp.d3EITJailU` のようにテンポラリディレクトリを表示して入力待ちになります。 `ENTER`
を押して正常終了したり `Ctrl`+`C` で止めたりするとそのディレクトリは消されます。




[trap](http://www.gnu.org/software/bash/manual/html_node/Bourne-Shell-
Builtins.html#index-trap) で `EXIT` のハンドラを書けばよいと思います。次のようなスクリプトでテストしてみてください。

[code]

    #!/bin/bash
    TMPDIR=$(mktemp -d)
    trap "rm -rf $TMPDIR" EXIT
    echo "Created $TMPDIR"
    read a
    
[/code]

実行すると `Created /tmp/tmp.d3EITJailU` のようにテンポラリディレクトリを表示して入力待ちになります。 `ENTER`
を押して正常終了したり `Ctrl`+`C` で止めたりするとそのディレクトリは消されます。

