bash で 終了時に 一時ファイルを自動的に削除する

(使っている Linux は Ubuntu 14.04.3 LTS です)

シェルスクリプトで作成した 一時ファイルを 終了後に自動的に消します。

ポイントは 2点あります。

@子プロセスで作成した一時ファイルのパスを 親プロセスで取得するのは シェルスクリプトでは大変なので、 一時ファイルは最初に起動したシェルスクリプトが 作成するディレクトリの配下に格納します。

A最初に起動したシェルスクリプトの終了時に builtinコマンドの trap で 一時ファイルを削除する処理(function)を自動的に実行します。

まず、一時ファイル用のディレクトリを作成します。

declare -r SCRIPT_PATH=${BASH_SOURCE:-$0}
declare -r SCRIPT_NAME=$(basename "${SCRIPT_PATH}")
declare -r SCRIPT_TMP_DIR=$(mktemp -d -t "${SCRIPT_NAME}.XXXXXX")

何かあったときに調査しやすいように シェルスクリプトの名前を付けたディレクトリを作成します。

上記の場合 環境変数 TMPDIR に従って 次のようなディレクトリ名になります。 (TMPDIR が /tmpの場合)

/tmp/hogehhoge.sh.mBzqNx

この値を 環境変数 TMPDIR にセットします。

export TMPDIR=${SCRIPT_TMP_DIR}

これで 子プロセスや functionなどで 一時ファイルを作る際も mktemp に 環境変数 TMPDIR を使用するオプションを付けておけば 同じディレクトリに 一時ファイルを作成することができます。

次に 自動的に 一時ファイルを削除する仕組みです。

一時ファイルを削除して終了する functionを定義します。

function on_exit_event() {
    local script_exit_code=${1}
    rm -Rf "${SCRIPT_TMP_DIR}"
    exit ${script_exit_code}
}

rmコマンドのオプションに "-f" を付けてファイルがないときもエラーが出ないようにし、 "-R" で、ファイルではなく、一時ディレクトリを作成した場合も削除できるようにします。

これを trap で起動するようにします。

trap 'on_exit_event ${?}' EXIT

これで 一時ファイルが 最初に起動したシェルスクリプトの終了時に 自動的に削除されます。

全体は次のようになります。

#!/usr/bin/env bash

declare -r SCRIPT_PATH=${BASH_SOURCE:-$0}
declare -r SCRIPT_NAME=$(basename "${SCRIPT_PATH}")
declare -r SCRIPT_DIR=$(cd $(dirname "${SCRIPT_PATH}"); pwd)
declare -r SCRIPT_FULL_PATH=${SCRIPT_DIR}/${SCRIPT_NAME}

declare -r SCRIPT_TMP_DIR=$(mktemp -d -t "${SCRIPT_NAME}.XXXXXX")
export TMPDIR=${SCRIPT_TMP_DIR}

function on_exis_sub_event() { :; }

function on_exit_event() {
    local script_exit_code=${1}
    on_exis_sub_event
    rm -Rf "${SCRIPT_TMP_DIR}"
    exit ${script_exit_code}
}

trap 'on_exit_event ${?}' EXIT

(主処理)

on_exis_sub_eventは 終了時の処理を追加したくなった場合に 上書きするための functionです。 とりあえず 空で定義しておいて 必要に応じて 後で再定義します。

Google サイト内検索

Amazonアソシエイト