mktempコマンドは一時的なファイル(テンポラリファイル)を作成するコマンドです。
テンポラリファイルはファイル名が衝突しないように作成されます。
目次
mktempコマンドとは
mktempコマンドは、コマンドライン引数にテンプレートとなるファイル名を入力することでランダムな名前のファイル名を生成します。テンプレートとなるファイル名は、例えば、「tmpfile.XXXX」のような名前であり、連続した3つ以上の「X」が並んだファイル名となります。mktempコマンドはこの「X」がランダムなアルファベットと数字に置き換わったファイル名のファイルを生成します。
コマンドやリダイレクトを用いてテンポラリファイルを作成したいとき、ファイル名を指定しなければなりません。このファイル名が固定されたファイル名の場合、動作させるプログラムによってはそのファイル名に対して競合が起こります。
たとえば、複数のユーザが同じスクリプトファイルを利用し、そのスクリプトファイルに「/tmp/tempfile」のように固定されたファイル名を利用していると考えます。そのスクリプトファイルが複数の人に同時に実行されると、そのスクリプトファイルの内容によっては、作業中の「/tmp/tempfile」を他の誰かのユーザが変更してしまい、そのスクリプトファイルは意図した動作と違う動作が起こる可能性があります。
mktempコマンドはそのようなファイル名の競合を防ぎ、他のユーザからのそのようなファイル修正を防ぐことができます。
また、mktempコマンドの終了ステータスは、ファイルの作成に成功すると0(true)、それ以外の場合が1(false)になります。
mktempコマンドの利用例
テンポラリファイルを作成
(オプションなし)
mktempコマンドはテンプレートとなるファイル名をコマンドライン引数にすることでファイルを作成することができます。mktempコマンドがファイルの作成に成功すると作成したファイル名を出力します。
テンプレートとなるファイル名は「file-XXX.txt」のように連続した3つ以上のXを入れる必要があり、一番後ろにある連続したXがランダムなアルファベットや数字に置き換わります。
また、テンプレートとなるファイル名は相対パスまたは絶対パスで記述することができます。
作成したファイル権限は現在のユーザの読み込みと書き込みのみになります。
コマンド例と実行結果
1 2 3 4 5 |
$mktemp file-XXX.txt file-kDk.txt $ls -l 合計 0 -rw------- 1 ubuntu ubuntu 0 10月 27 10:22 file-kDk.txt |
コマンドライン引数が省略されるとテンプレートとなるファイル名に「tmp.XXXXXXXXXX」の設定と-pオプションが暗黙的に設定されます。また、-pオプションは保存するディレクトリの設定になります。
コマンド例
1 |
mktemp |
実行結果
1 |
/tmp/tmp.ERNRW6Ihcj |
また、-pオプションは環境変数TMPDIRを利用しているため、以下のように環境変数TMPDIRを用いて保存するディレクトリを指定し、テンプレートとなるファイル名を入力せずにファイルを作成することもできます。また、下のコマンド例ではカレントディレクトリを指定しています。
コマンド例
1 |
TMPDIR=. mktemp |
実行結果
1 |
./tmp.D9EwmTGZgT |
mktempコマンドで作成されたファイルは変数に代入することで利用することができます。以下のシェルスクリプトはテンポラリファイルの作成と削除の例です。シェルスクリプトの例では終了ステータスを利用して、テンポラリファイルの作成成功時のみに処理を行います。
mktemp-example.sh
1 2 3 4 5 |
#/bin/bash file=$(mktemp file-XXX.txt) && { rm -v $file } |
実行結果
1 |
'file-g6L.txt' を削除しました |
trapコマンドでシェルが終了したときにテンポラリファイルを削除する方法もあります。
trapコマンドの例
1 2 |
file=$(mktemp file-XXX.txt) trap 'rm -v "$file"' EXIT |
EXITはシェルが終了したときにコマンドが実行されます。trapコマンドについてはbashのマニュアルや組み込みコマンドであるhelpコマンドで確認でき、ここにEXITシグナルの記述があります。
1 |
help trap |
また、他のシグナルについてはmanコマンドで確認することもできます。
1 |
man 7 signal |
テンポラリのディレクトリを作成
(-dオプション)
-dオプションを用いるとファイルではなく、ディレクトリを作成します。このディレクトリの権限は、現在のユーザの読み込み(r)、書き込み(w)、検索(x)の権限で作成されます。
コマンド例と実行結果
1 2 3 4 5 |
$mktemp -d dir-XXX dir-aTM $ls -l 合計 4 drwx------ 2 ubuntu ubuntu 4096 10月 27 10:51 dir-aTM |
ファイルを作成せずにファイル名を取得
(-uオプション)
-uオプションは、ファイルを作成せずにファイル名のみを取得することができます。このオプションは、ファイルの作成を行わないため、コマンドを実行した時点での競合が起こらないファイル名の取得ということに注意が必要です。
コマンド例
1 |
mktemp -u file-XXX.txt |
実行結果
1 |
file-WuN.txt |
テンポラリファイルを作成するディレクトリを指定
(-pオプション)
-pオプションは、相対パスで記述されたテンプレートとなるファイル名で作成されるファイルを保存するディレクトリを指定することができます。保存するディレクトリが省略された場合、環境変数TMPDIRが使用されます。環境変数TMPDIRが設定されていない場合は「/tmp」のディレクトリが使用されます。
コマンド例と実行結果
1 2 3 4 5 6 7 8 9 10 11 |
$ls tmpdir $mktemp -p tmpdir file-XXX.txt tmpdir/file-RCb.txt $ $tree . └── tmpdir └── file-RCb.txt 1 directory, 1 file |
接尾辞を指定
(--suffixオプション)
--suffixオプションはファイル名の最後のつける接尾辞を指定することができます。
コマンド例
1 |
mktemp --suffix=.XXX file-XXX |
実行結果
1 |
file-HZg.XXX |
作成失敗時のエラーメッセージを表示しない
(-qオプション)
-qオプションでmktempコマンドでファイルを作成できないときのエラーメッセージを出さないようにすることができます。ファイル作成に成功すると、オプションがない時と同様にファイル名を出力し、ファイルが作成されます。
コマンド例
1 |
mktemp -q file.XXX |
実行結果(ファイル作成 失敗時)
何も出力しません。
実行結果(ファイル作成 成功時)
1 |
file.GXi |
コマンド例
1 |
mktemp file.XXX |
実行結果(標準エラー出力)
1 |
mktemp: テンプレート `file.XXX' からファイルを作成できません: File exists |