在 Linux Bash 中创建临时文件

Fedora 系统上的 mktemp 命令和 Debian 系统上的 tempfile 专门用于减轻这种负担,使创建、使用和删除唯一文件变得容易。
4 位读者喜欢这篇文章。
bash logo on green background

Opensource.com

在 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

查找您的临时文件

使用自动生成的临时文件的问题在于,您无法知道它的名称会是什么。这就是为什么这两个命令都将生成的文件名作为输出返回。您可以使用交互式 shell,例如 Konsole、GNOME Terminal 或 rxvt,使用终端上显示的文件名与该文件进行交互。

但是,如果您正在编写脚本,则无法通过读取文件名并在后续命令中使用它来进行干预。

mktemptempfile 的作者考虑到了这个问题,并且有一个简单的解决方法。终端将输出发送到一个名为 stdout 的流。您可以通过将变量设置为在子 shell 中启动的命令的结果来捕获 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 作为 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(它与包含 chmodcutdu 和其他基本命令的软件包相同)。

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

总结

临时文件很方便,因为不会混淆它们是否可以安全删除。它们是临时的,旨在根据需要使用并在完成后毫不犹豫地丢弃。在需要时使用它们,并在完成后清除它们。

标签
Seth Kenlon
Seth Kenlon 是一位 UNIX 极客、自由文化倡导者、独立多媒体艺术家和 D&D 爱好者。他曾在电影和计算机行业工作,通常同时进行。

3 条评论

很棒的文章
另请撰写一篇关于临时文件用途的详细文章

tempfile 在 Ubuntu 中至少自 20.04 版本以来已被弃用。默认安装了 mktemp。

非常好!
例如,这篇文章让我想起了在临时框中运行的子脚本执行。

Creative Commons License本作品根据知识共享署名-相同方式共享 4.0 国际许可协议获得许可。
© . All rights reserved.