1. 概要

このチュートリアルでは、Linuxを使用するときに一時ファイルを作成する方法を示します。 一時ファイルの目的を説明することから始め、その後、ほとんどのLinuxシステムで利用可能なmktempユーティリティの使用法を続けます。 次に、POSIX互換のソリューションで終了します。

2. 一時ファイルのユースケース

スクリプトを作成するときは、中間の一時ファイルを生成すると便利なことがよくあります。 これらのスクリプトはこれらのファイルを作成し、実行が完了すると最終的に削除します。

スクリプトに一時ファイルを作成する理由はいくつかあります。たとえば、次のようなものがあります。

  • 別のプロセス/スクリプトに情報を渡す
  • スクリプトがクラッシュした場合に備えて、デバッグ情報を保存する
  • 操作を行う前に一部のデータを脇に置いておく

ちなみに、これらの一時ファイルは /tmpディレクトリに作成することをお勧めします。

このディレクトリは通常、オペレーティングシステムがtmpfsファイルシステムを使用して作成します。 このタイプのファイルシステムを使用することにより、ディレクトリをアンマウントするか、マシンを再起動することにより、ディレクトリをクリーンアップできます。

3. Linuxでの一時ファイルの作成

3.1. デフォルトの使用法

ほとんどのLinuxディストリビューションには、便利な mktemp ユーティリティが用意されており、Linuxで一時ファイルを簡単に作成できます。

引数なしでmktempを実行すると、/ tmp に一時ファイルが作成され、ターミナルの出力にファイルのパスが表示されます。

$ mktemp
/tmp/tmp.Dr6IfAc2HN

3.2. テンプレートの使用

/ tmp ディレクトリでの検出を容易にするために、一時ファイルにプレフィックスを付けたい場合があります。

例として、 foo という名前のスクリプトがあり、fooによって作成された一時ファイルの形式を/tmp/foo-XXXXX。にしたいとします。

これを実現するために、テンプレート引数をmktempに渡します。

$ mktemp /tmp/foo-XXXXX
/tmp/foo-J5BMk

テンプレートでは、少なくとも3つの「X」テンプレート文字を指定する必要があります。

mktemp は、接尾辞の追加やファイルを作成するディレクトリの指定など、テンプレートを作成するためのさらに多くのオプションを提供します。

3.3. ファイルへのアクセス

シェルスクリプトで一時ファイルを作成する場合、通常はそのファイルにアクセスする必要があります。 そのために、パスを変数に割り当てることができます。

スクリプトで作成したばかりのファイルを使用する方法を示す例を見てみましょう。

TMPFILE=$(mktemp /tmp/foo-XXXXX)
echo "Hello world" >> $TMPFILE  # Append some text to the file
cat $TMPFILE                    # Print the contents of the file
rm $TMPFILE                     # Delete the file

スクリプトを実行するたびに、新しいファイルが作成されることを忘れないでください。

3.4. trapコマンドを使用してファイルを削除する

大きな一時ファイルを保持する場合、スクリプトが失敗した場合に備えて、ハウスキーピングを実行することをお勧めします。

これは、 trapコマンドを使用して実行できます。これにより、終了コードが検出されたときにコードを実行できます

TMPFILE=$(mktemp /tmp/foo-XXXXXX)
trap "rm -f $TMPFILE" EXIT

# Our smart code

上記の例では、 TMPFILE を削除するコードは、EXIT信号が検出されるたびに実行されます。

コマンドラインでtrap-l と入力すると、trapコマンドで使用できる使用可能な信号のリストが表示されます。

4. POSIX互換バージョン

残念ながら、 mktemp ユーティリティは、POSIX仕様の一部ではないため、常に利用できるとは限りません。

代わりに、POSIXはmkstemp関数をCAPIの一部として指定します。

mkstemp(template)関数は、 template から派生した一意の名前で通常のファイルを作成し、読み取りおよび書き込み用に開いているファイルのファイル記述子を返します。

この関数は、GNUM4マクロプロセッサによってマクロとして実装されています。 GNU M4マクロプロセッサは、マクロトークンを展開した後、すべての入力テキストを出力にコピーします。

このツールを使用して、mktempユーティリティの自作バージョンを作成できます。

$ echo 'mkstemp(/tmp/foo-XXXXXX)' | m4
/tmp/foo-dormh3

このバージョンはPOSIX互換であり、mktempユーティリティとまったく同じように動作します。

TMPFILE=$(echo 'mkstemp(/tmp/foo-XXXXXX)' | m4)
echo "Hello world" >> $TMPFILE # Append some text to the file
cat $TMPFILE                   # Print the contents of the file
rm $TMPFILE                    # Delete the file

5. 結論

Linuxでスクリプトを作成する場合、一時ファイルは不可欠なツールです。 これらは、プロセス間で情報を渡したり、デバッグ情報を保存したり、操作する前にデータを保存したりする簡単な方法を提供します。

ほとんどのLinuxディストリビューションは、 mktemp ユーティリティを提供します。このユーティリティは、一時的なファイル名を生成するための使いやすいゲートウェイを提供します。

mktemp はPOSIXに準拠していないため、GNUM4マクロプロセッサを使用してPOSIX準拠のバージョンを作成できます。 このツールは、CAPIで指定されたmkstemp()関数を拡張できます。