【轻实验】在 Linux 上创建临时文件
3实验 320查看
Google
1443
Google
L1443
2022-07-05 16:25
启动环境

图片描述

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

创建一个临时文件

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

$ tempfile
/tmp/fileR5dt6r

$ mktemp
/tmp/tmp.ojEfvMaJEp
copy

除非你指定一个不同的路径,否则系统默认会把临时文件放在 /tmp 目录下。对于 mktemp 命令,可以使用 -p 选项来指定一个路径:

$ mktemp -p ~
/home/shiyanlou/tmp.i8NuhzbEJN
copy

对于 tempfile 命令,可以使用 --directory 或者 -d 选项:

$ tempfile --directory ~
/home/shiyanlou/fileIhg9aX
copy

找到你的临时文件

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

然而,如果你正在写一个 Shell 脚本,你就不能直接通过读取终端里输出的文件名并在后面的命令中使用它了。

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

$ TMPFILE=$(mktemp -p ~)

$ echo $TMPFILE
/home/shiyanlou/tmp.PjP3g6lCq1
copy

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

用 mktemp 创建一个临时目录

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

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

$ file /home/shiyanlou/tmp.68ukbuluqI
/home/shiyanlou/tmp.68ukbuluqI: directory
copy

mktemp 自定义临时文件名称

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

$ mktemp -p ~/--suffix .mine
/home/shiyanlou/tmp.dufLYfwJLO.mine
With tempfile, you can set a prefix and a suffix:

$ tempfile --directory ~ --prefix tt_ --suffix .mine
/home/shiyanlou/tt_0dfu5q.mine
copy

tempfile 自定义临时文件名称

你也可以通过 tempfile 命令设置自定义名称:

$ tempfile --name not_random
not_random
copy

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

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

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

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

注意,tempfile 命令并不是默认安装在所有的 Linux 发行版上的,所以在你把它作为脚本中的测试命令之前,你必须确保它的存在。

安装 mktemp 和 tempfile 命令

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

Debian Utils 软件包包括 tempfile 命令,默认安装在大多数基于 Debian 的发行版(Ubuntu、Kali 等)和 Slackware Linux 上。

收尾

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

原帖地址:make-temporary-file-bash

使用 DeepL 免费版翻译并修订。

#轻实验
你的回复