(使っている 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です。 とりあえず 空で定義しておいて 必要に応じて 後で再定義します。