在Linux上用Bash制作一个临时文件的方法

169 阅读3分钟

基于Fedora的系统上的mktemp命令和基于Debian的系统上的tempfile是专门为减轻这种负担而设计的,它使创建、使用和删除独特的文件变得容易。

bash logo on green background

在用Bash脚本语言编程时,你有时需要创建一个临时文件。例如,你可能需要有一个可以提交到磁盘的中间文件,这样你就可以用另一个命令来处理它。创建一个诸如temp 或任何以.tmp 结尾的文件是很容易的。然而,这些名字同样有可能是由其他进程生成的,所以你可能会不小心覆盖了一个现有的临时文件。除此之外,你不应该花心思去想那些看起来独一无二的名字。在基于Fedora的系统上的mktemp 命令和基于Debian的系统上的tempfile 命令是专门为减轻这种负担而设计的,它使创建、使用和删除唯一文件变得容易。

创建一个临时文件

mktemptempfile 都将创建一个临时文件作为其默认动作,并将该文件的名称和位置作为输出打印出来。

$ tempfile
/tmp/fileR5dt6r

$ mktemp 
/tmp/tmp.ojEfvMaJEp

除非你指定不同的路径,否则系统会将临时文件放在/tmp 目录中。对于mktemp ,使用-p 选项来指定路径。

$ mktemp -p ~/Demo
/home/tux/Demo/tmp.i8NuhzbEJN

对于tempfile ,使用--directory-d 选项。

$ tempfile --directory ~/Demo/
/home/sek/Demo/fileIhg9aX

找到你的临时文件

使用自动生成的临时文件的问题是,你没有办法知道它的名字是什么。这就是为什么这两个命令都将生成的文件名作为输出返回。你可以使用Konsole、GNOME终端或rxvt等交互式外壳,使用终端上显示的文件名来与文件进行交互。

然而,如果你正在写一个脚本,你就没有办法通过读取文件名并在下面的命令中使用它来进行干预了。

mktemptempfile 的作者想到了这个问题,而且有一个简单的解决办法。终端将输出发送到一个叫做stdout 的流*。* 你可以通过将一个变量设置为子壳中启动的命令的结果来捕获stdout。

$ TMPFILE=$(mktemp -p ~/Demo)

$ echo $TMPFILE
/home/tux/Demo/tmp.PjP3g6lCq1

在引用文件时使用$TMPFILE ,这与直接与文件本身进行交互是一样的。

用mktemp创建一个临时目录

你也可以使用mktemp 命令来创建一个目录而不是一个文件。

$ mktemp --directory -p ~/Demo/
/home/tux/Demo/tmp.68ukbuluqI

$ file /home/tux/Demo/tmp.68ukbuluqI
/home/tux/Demo/tmp.68ukbuluqI: directory

自定义临时名称

有时你可能希望在你的伪随机生成的文件名中有一个可预测的元素。你可以用这两个命令自定义你的临时文件的名称。

使用mktemp ,你可以为你的文件名添加一个后缀。

$ mktemp -p ~/Demo/ --suffix .mine
/home/tux/Demo/tmp.dufLYfwJLO.mine

tempfile ,你可以设置一个前缀和后缀。

$ tempfile --directory ~/Demo/ \
--prefix tt_ --suffix .mine
/home/tux/Demo/tt_0dfu5q.mine

Tempfile as touch

你也可以用tempfile 设置一个自定义的名字。

$ tempfile --name not_random
not_random

当你使用--name 选项时,它是绝对的,忽略了所有其他形式的自定义。事实上,它甚至忽略了--directory 选项。

$ tempfile --directory ~/Demo \
--prefix this_is_ --suffix .all \
--name not_random_at
not_random_at

在某种程度上,tempfile 可以替代touchtest ,因为它拒绝创建一个已经存在的文件。

$ tempfile --name example.txt
open: file exists

tempfile 命令并没有默认安装在所有的Linux发行版上,所以你必须确保它的存在,然后再把它作为脚本中的test 的一个黑客。

安装 mktemp和tempfile

GNU Core Utils包括mktemp 命令。主要的发行版默认包括Core Utils(它是包含chmod,cut,du 和其他基本命令的同一个软件包)。

蝶变Utils软件包包括tempfile 命令,并默认安装在大多数基于蝶变的发行版和Slackware Linux上。

收尾工作

临时文件很方便,因为没有关于它们是否可以安全删除的困惑。它们是临时性的,目的是在需要时使用,然后不假思索地丢弃。当你需要的时候使用它们,当你完成的时候再把它们清除掉。