[Linux] tmp ファイルを作るなら mktemp コマンドを使うのが安全
Linux で /tmp ディレクトリ以下に tmp ファイルを作るなら mktemp コマンドを使うと安全にファイル作成できます。
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 ファイル作成したい現場からお送りしました。
参考情報
- Man page of MKTEMP
- GNU Coreutils: 18.4 mktemp: テンポラリファイルやディレクトリを作成する
- 安全な一時ファイルの作成と削除の方法 – 拡張 POSIX シェルスクリプト Advent Calendar 2013 – ダメ出し Blog
- Man page of OPEN
- Man page of MKSTEMP