[Linux] tmp ファイルを作るなら mktemp コマンドを使うのが安全

Linux で /tmp ディレクトリ以下に tmp ファイルを作るなら mktemp コマンドを使うと安全にファイル作成できます。

Linux | リナックス

mktemp の使い方

mktemp 以降に、任意のファイル名 +「X」を3つ以上を指定すると、「X」を指定した部分が適当な文字列に置き換わります。

$ mktemp /tmp/XXXXXX
/tmp/DCz1yP

ちなみに mktemp は引数無しで動かしても良いのですが、ディストリビューションや macOS によっては /tmp 以外のディレクトリが TMPDIR になってることがあるので、ディレクトリを指定する方が無難です。

[定番] mktemp と mv または ln を組み合わせて使う

ファイル名を固定にしていると同じコマンドを実行した際に同じファイルに上書きして中身の整合性が取れなくなるので、テンポラリファイルを作ってから mv(後勝ちで良い)か ln(先勝ちになる)するのが割と一般的な処理です。

mktemp と mv を組み合わせた実用例

TMPFILE=`mktemp`
なんか処理 > "$TMPFILE"
mv "$TMPFILE" 要るファイル

mktemp と ln を組み合わせた実用例

TMPFILE=`mktemp`
ln "$TMPFILE" 要るファイル固定
なんか処理 > 要るファイル

[余談] macOS では suffix は付けれない

mktemp /tmp/XXXXXX.csv って macOS で実行すると XXXXXX.tsv ってファイルが作成されるけど、Amazon Linux で実行すると

[ec2-user@aws ~]$ mktemp /tmp/XXXXXX.csv
/tmp/DCz1yP.csv

みたいにランダムにファイル名が付与されるのか。macOS で試してみて、「なんやこれ」ってなりました。

Unix 系の OS だと suffix はあまり関係ないので mktemp /tmp/XXXXXX とするのは割と普通な感じです。 Mac OS X だと GNU coreutils の gmktemp を使うと Linux と同じ挙動になります。

$ brew install coreutils
$ gmktemp /tmp/XXXXX.csv
/tmp/cdWSV.csv

以上、mktemp コマンドで安全に tmp ファイル作成したい現場からお送りしました。

参考情報