一時ファイルの作成と削除をする関数

関数名 Tmp_Lock
書式 Tmp_Lock ( -l | -t ) ( -m | -r )
目的 一時ファイルの作成・削除をする
戻り値 成功:0 失敗:1 エラー9:

オプションによって通常の一時ファイルかロックファイルの
作成・削除を判断するためオプションは必須。
一時ファイルとはスクリプトの動作中にだけ必要なファイルのこと。
そのファイルはスクリプトが終了すれば必要ないので最後に削除する。
ロックファイルはスクリプトを実行するときに同じスクリプト
重複実行できなくするために使う。
実行の最初にロックファイルをチェックして存在していたら
すでに同じスクリプトが別のプロセスで実行してるとみなし
実行を停止する動作をさせる。

Tmp_Lock () {
    . Error_Msg.sh && . Opt_Cnflct.sh && . Chk_File.sh && . Arg_Nums.sh ||\
        { echo "Tmp_Lock: error: Function not found." 1>&2; exit 9; }
    Arg_Nums -eq 2 "$@" ||\
        { Error_Msg Tmp_Lock "Nunber of arguments was wrong."; exit 9; }

    _TMP_LOCK_DIR=/tmp
    _TMP_LOCK_FILE=
    local _SCRIPT=$(basename "$0")
    local _ID=
    local _PID=$$
    local _EXT=lock
    local _OPTIONS=
    local _TYPE=
    local _MODE=
    local _EMPTY=
    local OPTIND=

    #オプションによる動作の決定
    while getopts ":lmrt" OPT; do
        case $OPT in
            l)  _TYPE=lock;;
            m)  _MODE=make;;
            r)  _MODE=remove;;
            t)  _TYPE=temp;;
            \?) Error_Msg Tmp_Lock "Wrong option found."; exit 9;;
        esac
        _OPTIONS=$_OPTIONS$OPT
    done

    #オプションのエラーチェックと引数の処理
    [ "$_OPTIONS" = "" ] && \
        { Error_Msg Tmp_Lock "No options were given."; exit 9; }
    Opt_Cnflct $_OPTIONS lt && Opt_Cnflct $_OPTIONS mr || \ 
        { Error_Msg Tmp_Lock "Bad options assortment found."; exit 9; }
    #OPTINDはgetoptsで使われる環境変数で次に処理される位置パラメータの番号
    shift $(($OPTIND - 1))
    _ID="$1"

    #対象ファイルの名称決定
    #一時ファイル・ロックファイル共通のファイル名を決定して
    #ロックファイルの場合は拡張子にlockを
    #一時ファイルの場合はPIDを付ける
    _TMP_LOCK_FILE="$_TMP_LOCK_DIR/$_SCRIPT-$_ID"
    if [ "$_TYPE" = lock ]; then
        _TMP_LOCK_FILE="$_TMP_LOCK_FILE.$_EXT"
    elif [ "$_TYPE" = temp ]; then
        _TMP_LOCK_FILE="$_TMP_LOCK_FILE.$_PID"
    else
        Error_Msg Tmp_Lock "Value of _TYPE was not permitted."; exit 9
    fi
   
    #ファイルの作成または削除
    #一時ファイル作成時には、そのディレクトリがユーザーが
    #自由に読み書きできるか確認する
    #また同じ名前の一時ファイル名があるか確認し
    #ある場合は戻り値を1にセットし終了する
    if [ "$_MODE" = make ]; then
        [ -e "$_TMP_LOCK_DIR" ] || mkdir "$_TMP_LOCK_DIR"
        Chk_File -drwx "$_TMP_LOCK_DIR" || \
        { Error_Msg Tmp_Lock "$_TMP_LOCK_DIR: Permission denied."; exit 9; }
        Chk_File -r "$_TMP_LOCK_FILE" && return 1
        touch "$_TMP_LOCK_FILE"
    elif [ "$_MODE" = remove ]; then
        Chk_File -r "$_TMP_LOCK_FILE" || return 1
        rm -f "$_TMP_LOCK_FILE"
    else
        Error_Msg Tmp_Lock "Value of _MODE was not permitted."; exit 9
    fi
}