はじめに

こんにちは!今回はmktempコマンドについて解説します。

mktempは、一時ファイルやディレクトリを安全に作成するコマンドです。ファイル名の衝突を避けたり、セキュリティリスクを回避したりできます。

シェルスクリプトで一時ファイルを使う時には、ほぼ必須のコマンドですよ。

mktempコマンドとは

mktempは、予測不可能な名前の一時ファイルまたはディレクトリを作成する外部コマンドです。

主な特徴:

  1. ユニークな名前生成 - 衝突しない名前を自動生成
  2. セキュリティ - 予測不可能な名前により、セキュリティ脆弱性を回避
  3. ファイル/ディレクトリ対応 - 両方作成可能
  4. テンプレート指定 - 名前パターンをカスタマイズ可能
  5. 自動削除オプション - スクリプト終了時に自動削除可能

/tmp下に安全な一時ファイルを作成できます。

基本構文

1
mktemp [オプション] [テンプレート]

テンプレートにXXXXXXを含めると、そこにランダム文字が入ります。

主なオプション

オプション 説明
-d ファイルではなくディレクトリを作成
-p ディレクトリ 指定したディレクトリに作成
-t テンプレートの最後にXXXXXXを自動追加
-u ファイルを作成しない(名前だけ返す)
--suffix=末尾 ファイル名の末尾に文字列を追加
--dry-run 実際には作成せず、名前を表示
--tmpdir=ディレクトリ 作成先ディレクトリ指定

使用例

例1: 一時ファイルを作成

1
2
3
4
temp_file=$(mktemp)
echo $temp_file
cat $temp_file
rm $temp_file

実行結果:

1
/tmp/tmp.XXXXXXXXXX

ランダムな名前の一時ファイルを作成します。

例2: 一時ディレクトリを作成

1
2
3
4
temp_dir=$(mktemp -d)
echo $temp_dir
ls -la $temp_dir
rmdir $temp_dir

実行結果:

1
2
/tmp/tmp.YYYYYYYYYY
total 0

ディレクトリを作成。作業用フォルダとして使えます。

例3: テンプレートを指定

1
2
3
temp_file=$(mktemp /tmp/myapp.XXXXXX)
echo $temp_file
rm $temp_file

実行結果:

1
/tmp/myapp.abc123

名前のパターンをカスタマイズ。

例4: 拡張子を指定

1
2
3
temp_file=$(mktemp --suffix=.log)
echo $temp_file
rm $temp_file

実行結果:

1
/tmp/tmp.XXXXXX.log

ファイル名の末尾に.logを追加。

例5: 指定ディレクトリに作成

1
2
3
4
mkdir -p /tmp/mywork
temp_file=$(mktemp -p /tmp/mywork)
echo $temp_file
rm $temp_file

実行結果:

1
/tmp/mywork/tmp.XXXXXX

特定のディレクトリに作成。

例6: 複数の一時ファイルを作成

1
2
3
4
5
input=$(mktemp)
output=$(mktemp)
echo "Input: $input"
echo "Output: $output"
rm $input $output

実行結果:

1
2
Input: /tmp/tmp.XXXXXXXXXX
Output: /tmp/tmp.YYYYYYYYYY

複数の一時ファイルを安全に作成。

例7: スクリプト内での利用

1
2
3
4
5
6
#!/bin/bash
temp_file=$(mktemp)
trap "rm -f $temp_file" EXIT

echo "処理中..." > $temp_file
cat $temp_file

実行結果:

1
処理中...

trapで終了時に自動削除。

例8: 名前だけ生成(作成しない)

1
2
temp_name=$(mktemp -u)
echo $temp_name

実行結果:

1
/tmp/tmp.XXXXXX

ファイルは作成せず、名前だけ返します。

例9: テンプレートの-tオプション

1
2
3
temp_file=$(mktemp -t myapp)
echo $temp_file
rm $temp_file

実行結果:

1
/tmp/myapp.XXXXXX

テンプレートに自動でXXXXXXを追加。

例10: エラー処理付き

1
2
3
4
5
6
7
#!/bin/bash
temp_file=$(mktemp) || {
    echo "一時ファイル作成失敗"
    exit 1
}
echo "Success: $temp_file"
rm $temp_file

実行結果:

1
Success: /tmp/tmp.XXXXXX

失敗時のエラー処理。

Tips・注意点

trapで自動クリーンアップ

1
2
3
4
temp_file=$(mktemp)
trap "rm -f $temp_file" EXIT INT TERM

# スクリプトがどこで終了しても自動削除

終了時に必ず削除するようにします。

複数ファイルの管理

1
2
3
4
5
temp_dir=$(mktemp -d)
trap "rm -rf $temp_dir" EXIT

temp_file1="$temp_dir/file1"
temp_file2="$temp_dir/file2"

複数ファイルはディレクトリごと管理。

/tmpがない場合の対応

1
mktemp -p "${TMPDIR:-.}"

環境変数TMPDIRを参照。ない場合はカレントディレクトリ。

実践的な使い方

スクリプトでの処理結果一時保存

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
#!/bin/bash
temp_output=$(mktemp)
trap "rm -f $temp_output" EXIT

command_output=$(mktemp)
trap "rm -f $command_output" EXIT

./my_process > "$temp_output"
if [ -s "$temp_output" ]; then
    echo "処理成功"
    cat "$temp_output"
fi

複数の一時ファイルで処理フロー管理。

ログファイル作成

1
2
3
4
5
6
log_file=$(mktemp -t myapp.log.XXXXXX)
trap "rm -f $log_file" EXIT

echo "$(date): 処理開始" >> $log_file
./my_command >> $log_file 2>&1
echo "$(date): 処理完了" >> $log_file

ログを一時ファイルに記録。

バックアップファイル作成

1
2
3
4
5
original="$1"
backup=$(mktemp --suffix=.backup)

cp "$original" "$backup"
echo "バックアップ: $backup"

元ファイルを保護するバックアップ作成。

パイプライン処理の中間結果

1
2
3
4
5
6
7
8
#!/bin/bash
temp1=$(mktemp)
temp2=$(mktemp)
trap "rm -f $temp1 $temp2" EXIT

cat input.txt | process1 > "$temp1"
cat "$temp1" | process2 > "$temp2"
cat "$temp2" | process3 > output.txt

複数ステップの処理を一時ファイル経由で実行。

まとめ

mktempコマンドのポイント:

  • 一時ファイル/ディレクトリを安全に作成するコマンド
  • デフォルト: /tmpに一時ファイルを作成
  • -d: ディレクトリを作成
  • -p ディレクトリ: 指定したディレクトリに作成
  • –suffix=末尾: ファイル名に末尾を追加
  • -u: 名前だけ生成(ファイルは作成しない)
  • 必須パターン: temp=$(mktemp); trap "rm -f $temp" EXIT

シェルスクリプトで安全に一時ファイルを扱いたい時に最高のコマンドですよ!