それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

linuxで一時的なパス名を作る、mktemp コマンド の使い方

一時ファイルを作るには mktemp が使える

Temporaryなファイルがほしいときは、mktemp で一発解決

$ mktemp 

だけど一時的なディレクトリを作るにはどうする?

mktemp すると、ファイル作成されちゃう。消すのも面倒くさい。 

そこで --dry-run なオプションを使うと解決

$ mktemp -u
$ mktemp --dry-run  # または

この、名前だけ取得する -u と組み合わせて戦う

$ mkdir $( mktemp -u )

ディレクトリを作るに、まぁ、mktemp -d すればイイんですが。私はパイプも作れる汎用的なのを求めてたので。

同じようにして、一時的な名前付きパイプも

名前付きパイプも同じですね

$ mkfifo $( mktemp -u )

一時ファイルを作るよりパイプで渡すほうがblockingなI/O が効くので便利なことも多いし、容量期にしなくてイイのも強い。lseek 出来ないけど。

何に使ってるかわからなくなるので、ファイル名のメモを残す

ファイル名のテンプレートを残せる。

オプション -t を使えば、tmp ファイルがなんのために作られたかよく分かる。

$ mktemp -u -t sample.XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX.jpg
/tmp/sample.3P6NasUvF857yfZHNaz8Xr9wj5yMz1t2.jpg
$ mktemp -u -t my-app-dir-XXXX
/tmp/my-app-dir-02tP

Xは最低3文字アレばいいみたい

/tmp なら再起動時に消えるから安心

/tmp は再起動時に消えるから安心。

最近だと、systemd のジョブに登録されてますね。

systemd-tmpfiles-clean.service

シェル・スクリプトの場合はtrapすればイイ

temp_name=$( mktemp -u)
trap 'rm -rf "$temp_name"' EXIT INT TERM HUP

ruby なども trap ですね。

参考資料

http://unix.stackexchange.com/questions/29851/shell-script-mktemp-whats-the-best-method-to-create-temporary-named-pipe