yassy's note

なんかかきます

シェルスクリプトで一時ファイルを作成する

最近シェルスクリプトを書く機会があった。
その中で一時ファイルを作成し、スクリプトの終了時に削除するように書いていた。こんな感じ。

touch /tmp/.lockfile
(いろいろな処理)
rm -f /tmp/.lockfile

で、もっとスマートな方法はないかなと探していたらmktempなるコマンドが存在することを知った。

mktempは名前の通り、/tmpに一時ファイルを作成するコマンドで、「/tmp/tmp.SX2rckOzx9」のようにtmp.<ランダム文字列>が作成される。
また、作成されるファイルの権限は600なのでセキュリティも考慮されている。

[root@ip-172-31-32-196 ~]# mktemp
/tmp/tmp.SX2rckOzx9
[root@ip-172-31-32-196 ~]#
[root@ip-172-31-32-196 ~]# ll /tmp/
-rw-------. 1 root root    0 Sep 15 06:17 tmp.SX2rckOzx9

もちろん、生成されるファイル名はある程度は変更できるため、以下のようにホスト名を含むことも可能。

[root@ip-172-31-32-196 ~]# mktemp /tmp/`hostname -s`_XXXXXX.tmp
/tmp/ip-172-31-32-196_Bu64v3.tmp
[root@ip-172-31-32-196 ~]#
[root@ip-172-31-32-196 ~]# ll /tmp/
-rw-------. 1 root root    0 Sep 15 06:20 ip-172-31-32-196_Bu64v3.tmp

XXXXXXはランダム文字列をどこに充てるかを指定している。
手元の環境(CentOS 7)では、最低3文字を指定する必要があるようだ。

TEMPLATE must contain at least 3 consecutive 'X's in last component.

mktempを使って最初に提示したスクリプトを修正すると、以下のようになる。

TEMP=`mktemp /tmp/.lockfile_XXXXXX`
(いろいろな処理)
rm -f $TEMP

ちなみに、-dオプションを使用するとディレクトリが作成される。

[root@ip-172-31-32-196 ~]# mktemp -d `hostname -s`_XXXXXX.tmp
ip-172-31-32-196_g4GFkO.tmp
[root@ip-172-31-32-196 ~]#
[root@ip-172-31-32-196 ~]# ll
drwx------. 2 root root    6 Sep 15 06:41 ip-172-31-32-196_g4GFkO.tmp