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