shell脚本经常需要存储临时数据。最适合存储临时数据的位置是 /tmp(该目录中的内容在系统重启后会被清空)。有两种方法可以为临时数据生成标准的文件名。

2.10.1 实战演练

mktemp命令可以为临时文件或目录创建唯一的名字。

创建临时文件

  1. $ filename=`mktemp`
  2. $ echo $filename
  3. /tmp/tmp.dINOLaaxCN
  1. [root@dev workspace]# filename=`mktemp`
  2. [root@dev workspace]# ls
  3. echo golang input.txt out.txt showArgs.sh tools variables.sh welcome.txt
  4. else if.sh output.txt printf.sh temp.txt umq vitest
  5. [root@dev workspace]# echo $filename
  6. /tmp/tmp.dINOLaaxCN
  7. [root@dev workspace]# ls /tmp
  8. installation ks-script-gpqu_kuo ks-script-_srt3u3c protobuf run tmp.dINOLaaxCN
  9. [root@dev workspace]#

上面的代码创建了一个临时文件,然后打印出保存在变量filename中的文件名。

创建临时目录

  1. $ dirname=`mktemp -d`
  2. $ echo $dirname
  3. /tmp/tmp.yHixD63fhb
  1. [root@dev workspace]# dirname=`mktemp -d`
  2. [root@dev workspace]# ls /tmp
  3. installation ks-script-gpqu_kuo ks-script-_srt3u3c protobuf run tmp.dINOLaaxCN tmp.yHixD63fhb
  4. [root@dev workspace]# ls -l /tmp
  5. total 24
  6. drwxr-xr-x 2 root root 4096 Jan 11 21:39 installation
  7. -rwx------ 1 root root 1379 Jan 14 2020 ks-script-gpqu_kuo
  8. -rwx------ 1 root root 671 Jan 14 2020 ks-script-_srt3u3c
  9. drwxr-xr-x 24 root root 4096 Jan 11 18:13 protobuf
  10. drwxr-xr-x 2 mysql mysql 4096 Jan 11 22:01 run
  11. -rw------- 1 root root 0 Jan 22 17:44 tmp.dINOLaaxCN
  12. drwx------ 2 root root 4096 Jan 22 17:49 tmp.yHixD63fhb
  13. [root@dev workspace]# echo $dirname
  14. /tmp/tmp.yHixD63fhb
  15. [root@dev workspace]#

上面的代码创建了一个临时目录,然后打印出保存在变量dirname中的目录名。

  • 如果仅仅是想生成文件名,不希望创建实际的文件或目录,可以这样:

    1. $ tmpfile=`mktemp -u`
    2. $ echo $tmpfile
    3. /tmp/tmp.sVkNMXT32P
    1. [root@dev workspace]# tmpfile=`mktemp -u`
    2. [root@dev workspace]# echo $tmpfile
    3. /tmp/tmp.sVkNMXT32P

    文件名被存储在$tmpfile中,但并没有创建对应的文件。

  • 基于模板创建临时文件名:

    1. $ mktemp test.XXX
    2. test.2tc

    2.10.2 工作原理

    mktemp命令的用法非常简单。它生成一个具有唯一名称的文件并返回该文件名(如果创建的是目录,则返回目录名)。

如果提供了定制模板,X会被随机的字符(字母或数字)替换。注意,mktemp正常工作的前提是保证模板中至少要有3X