shell脚本经常需要存储临时数据。最适合存储临时数据的位置是 /tmp(该目录中的内容在系统重启后会被清空)。有两种方法可以为临时数据生成标准的文件名。
2.10.1 实战演练
mktemp命令可以为临时文件或目录创建唯一的名字。
创建临时文件
$ filename=`mktemp`$ echo $filename/tmp/tmp.dINOLaaxCN
[root@dev workspace]# filename=`mktemp`[root@dev workspace]# lsecho golang input.txt out.txt showArgs.sh tools variables.sh welcome.txtelse if.sh output.txt printf.sh temp.txt umq vitest[root@dev workspace]# echo $filename/tmp/tmp.dINOLaaxCN[root@dev workspace]# ls /tmpinstallation ks-script-gpqu_kuo ks-script-_srt3u3c protobuf run tmp.dINOLaaxCN[root@dev workspace]#
上面的代码创建了一个临时文件,然后打印出保存在变量filename中的文件名。
创建临时目录
$ dirname=`mktemp -d`$ echo $dirname/tmp/tmp.yHixD63fhb
[root@dev workspace]# dirname=`mktemp -d`[root@dev workspace]# ls /tmpinstallation ks-script-gpqu_kuo ks-script-_srt3u3c protobuf run tmp.dINOLaaxCN tmp.yHixD63fhb[root@dev workspace]# ls -l /tmptotal 24drwxr-xr-x 2 root root 4096 Jan 11 21:39 installation-rwx------ 1 root root 1379 Jan 14 2020 ks-script-gpqu_kuo-rwx------ 1 root root 671 Jan 14 2020 ks-script-_srt3u3cdrwxr-xr-x 24 root root 4096 Jan 11 18:13 protobufdrwxr-xr-x 2 mysql mysql 4096 Jan 11 22:01 run-rw------- 1 root root 0 Jan 22 17:44 tmp.dINOLaaxCNdrwx------ 2 root root 4096 Jan 22 17:49 tmp.yHixD63fhb[root@dev workspace]# echo $dirname/tmp/tmp.yHixD63fhb[root@dev workspace]#
上面的代码创建了一个临时目录,然后打印出保存在变量dirname中的目录名。
如果仅仅是想生成文件名,不希望创建实际的文件或目录,可以这样:
$ tmpfile=`mktemp -u`$ echo $tmpfile/tmp/tmp.sVkNMXT32P
[root@dev workspace]# tmpfile=`mktemp -u`[root@dev workspace]# echo $tmpfile/tmp/tmp.sVkNMXT32P
文件名被存储在
$tmpfile中,但并没有创建对应的文件。基于模板创建临时文件名:
$ mktemp test.XXXtest.2tc
2.10.2 工作原理
mktemp命令的用法非常简单。它生成一个具有唯一名称的文件并返回该文件名(如果创建的是目录,则返回目录名)。
如果提供了定制模板,X会被随机的字符(字母或数字)替换。注意,mktemp正常工作的前提是保证模板中至少要有3个X。
