Lから始まるLinux

3章24話
setコマンド
3章25話 一時ファイル作成
もくじ
3章26話
シグナル処理
一時ファイル作成
若木 みどり
お兄ちゃん! /tmp 配下に一時ファイルを作ると 名前がかぶって困ることがあるんだ!
若木 みどり
/tmp 配下は誰でもファイルを作れるので 名前がかぶることはあるとは思うんだけど… どうしたらいいかな?
若木 しげる
いくつか方法があるよ 今回は一時ファイルを 作る方法を学ぼう!
$ 変数
若木 しげる
$ 変数には 「シェルのPID」が代入されているんだ シェルスクリプトの場合には それを解釈しているシェルの PID だね これを一時ファイルの名前に含めれば 名前がかぶる心配はほぼ無くなるよ
若木 みどり
PID はプロセスの 一意となる番号だったよね PID を名前に含めれば 問題を解決できそう!
若木 しげる
以下のように したらどうだろう?
#!/bin/bash

# 一時ファイル作成
TEMP_FILE="/tmp/${0##*/}.$$"
touch "$TEMP_FILE"

# 一時ファイルを使う処理
...

# 一時ファイル削除
rm "$TEMP_FILE"
若木 みどり
${0##*/}.$$スクリプト名.シェルのPID という一時ファイル名にしているんだ!これならかぶる心配がなさそうだね!
mktemp コマンド
若木 しげる
$ 変数を使えば名前がかぶる心配はほぼ無くなるけどゼロではないんだ
若木 みどり
厳密なスクリプトだと困ることがありそうだね
若木 しげる
mktemp名前がかぶらない一時ファイルを作るよ
mktemp [オプション]... テンプレート文字列
オプション役割
-dファイルではなくディレクトリを作成
若木 みどり
テンプレート文字列どう書くのかな?
若木 しげる
普通のパスのように書けるよただし大文字の X連続している箇所は一意となる文字列に置き換えられるんだ
若木 みどり
作られたファイル名はどうやって知るのかな?
若木 しげる
作成されたファイル名は標準出力に出力されるんだなのでコマンド置換 $( ... )一緒に使うといいよ
若木 しげる
mktemp一時ファイルを作る例を見てみよう!
#!/bin/bash

# 一時ファイル作成
TEMP_FILE="$(mktemp "/tmp/${0##*/}.XXXXXXXX")"

# 一時ファイルを使う処理
...

# 一時ファイル削除
rm "$TEMP_FILE"
まとめ
若木 みどり
今回は一時ファイルの作り方を学んだよ!固定された名前はかぶる可能性があるので$ 変数の値を名前に含めたりmktemp を使うんだ!
若木 しげる
スクリプト実行中に一時ファイルを作る場合はこれらを活用しよう!「一時ファイル」「一時ディレクトリ」置き換えても使えるよ