お兄ちゃん!
/tmp 配下に一時ファイルを作ると
名前がかぶって困ることがあるんだ!
/tmp 配下は誰でも
ファイルを作れるので
名前がかぶることは
仕方ないと思うんだけど…
どうしたらいいかな?
いくつか方法があるよ
今回は名前がかぶらない
一時ファイルを
作る方法を学ぼう!
$ 変数$ 変数には
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"
このスクリプトでは
/tmp/スクリプト名.ランダムな8文字という名前の一時ファイルを作るよ偶然名前がかぶってしまった場合ランダムな文字列をかぶらなくなるまで選び直してくれるんだ
この方法なら名前のかぶりは気にならなくなるね!
今回は一時ファイルの作り方を学んだよ!固定された名前はかぶる可能性があるので
$ 変数の値を名前に含めたりmktemp を使うんだ!スクリプト実行中に一時ファイルを作る場合はこれらを活用しよう!「一時ファイル」を 「一時ディレクトリ」に 置き換えても使えるよ