MKTEMP(1)

名称
mktemp - (ユニークな) 一時ファイル名を作成する

書式
mktemp [-d] [-q] [-t prefix] [-u] template ... mktemp [-d] [-q] [-u] -t prefix

解説
mktemp ユーティリティは、引数のファイル名テンプレートの一つ一つに対して、 その一部を上書きすることにより、ファイル名を生成します。 このファイル名はユニークであり、アプリケーションが使用するのに適しています。 テンプレートは、いくつかの ‘X’ が後続する任意のファイル名であり、例えば /tmp/temp.XXXX です。 後続する ‘X’ は、現在のプロセス番号やユニークな文字の組み合わせと置き換えられます。 mktemp が返すことが可能なユニークなファイル名の数は、指定した ‘X’ の数に依存します; ‘X’ を 6 つ指定した場合には、およそ 26 ** 6 の組み合わせを mktemp が扱えることとなります。

mktemp がユニークなファイル名を生成することに成功した場合、 ファイルがモード 0600 ( -u フラグ未指定時) で作成され、ファイル名が標準出力に出力されます。

-t prefix オプション指定時には、 mktemp はテンプレート文字列を prefix と、 TMPDIR 環境変数が設定されていればそれも用いて生成します。 TMPDIR が設定されていない場合の、デフォルトの場所は /tmp です。ユーザが指定したかもしれない環境変数の使用が適切であると保証 できるかどうかに注意を払ってください。

1 回の起動でいくつでも一時ファイルを作ってかまいません。これには、 -t フラグの結果の内部テンプレートをもとにするものひとつも含まれます。

mktemp は、シェルスクリプトが安全に一時ファイルを使用するために提供されています。 伝統的に多くのシェルスクリプトが、 プログラム名に pid を付けた名前を一時ファイル名として使用しています。 この種の命名法は予測されうるので、 レース状態となった場合に容易に攻撃者が勝ってしまいます。 より安全、しかしながらまだ劣ったアプローチとして、 同じ命名法でディレクトリを作るというものがあります。 この方法では一時ファイルが壊されないことを保証できますが、 単純なサービス停止攻撃を許してしまいます。 上記のような理由により、 mktemp の使用をお勧めします。

オプション
使用可能なオプションを以下に示します:

-d  ファイルではなくディレクトリを作成します。

-q  エラーが発生した場合、黙って失敗します。 エラー出力が標準エラーに出力されることが望ましくないスクリプトで有用です。

-t prefix
    ファイル名テンプレートを生成するために必要なテンプレートを生成します (与えられた prefix と、設定されている場合には TMPDIR を使用します)。

-u  “安全ではない” モードで操作します。一時ファイルは mktemp が終了する前にアンリンクされます。これは mktemp(3) よりは少しましですが、依然レース状態を引き起こします。 このオプションの使用はお勧めしません。

診断
mktemp ユーティリティは、成功時には値 0 で終了します。 失敗時には値 1 で終了します。

使用例
以下の sh(1) スクリプトの一部で、 mktemp の簡単な使用方法を説明します。 このスクリプトは、安全な一時ファイルを取得できない場合には終了します。

    tempfoo=`basename $0`
    TMPFILE=`mktemp /tmp/${tempfoo}.XXXXXX` || exit 1
    echo "program output" >> $TMPFILE

$TMPDIR を使用する場合には次のようにします:

    tempfoo=`basename $0`
    TMPFILE=`mktemp -t ${tempfoo}` || exit 1
    echo "program output" >> $TMPFILE

次の場合、スクリプト自身でエラーをつかまえます。

    tempfoo=`basename $0`
    TMPFILE=`mktemp -q /tmp/${tempfoo}.XXXXXX`
    if [ $? -ne 0 ]; then
    	echo "$0: Can't create temp file, exiting..."
    	exit 1
    fi

関連項目
mkdtemp(3), mkstemp(3), mktemp(3), environ(7)

歴史
mktemp ユーティリティは OpenBSD 2.1 に登場しました。この実装は OpenBSD のマニュアルページとは独立に記述され、 FreeBSD 2.2.7 に初めて登場しました。 このマニュアルページは OpenBSD 由来です。