Contents

在Linux中创建临时文件

1. 概述

在本教程中,我们将展示如何在使用 Linux 时创建临时文件。我们将首先解释临时文件的用途,之后我们将继续使用大多数 Linux 系统上可用的mktemp 实用程序。然后,我们将完成一个与 POSIX 兼容的解决方案。

2. 临时文件的用例

当我们编写脚本时,生成中间临时文件通常很有用。这些脚本将创建这些文件,并在它们完成运行后最终将它们删除。

我们可能希望在脚本中创建临时文件有几个原因,包括:

  • 将信息传递给另一个进程/脚本
  • 存储一些调试信息以防脚本崩溃
  • 在对其进行操作之前保留一些数据

作为旁注,最好在*/tmp*目录中创建这些临时文件。

该目录通常由操作系统使用tmpfs文件系统 创建。通过使用这种类型的文件系统,可以通过卸载目录或重新启动机器来清理目录。

3. 在 Linux 中创建临时文件

3.1. 默认用法

大多数 Linux 发行版都提供了方便的mktemp实用程序,它允许我们在 Linux 中轻松创建临时文件。

不带参数运行*mktemp将在/tmp*中创建一个临时文件,**并在终端输出中显示该文件的路径:

$ mktemp
/tmp/tmp.Dr6IfAc2HN

3.2. 使用模板

有时,我们可能想给我们的临时文件一个前缀,以便在*/tmp*目录中更容易检测到。

例如,假设我们有一个名为foo的脚本,并且 我们希望foo创建的临时文件具有/tmp/foo-XXXXX*格式。*

为此,我们将向mktemp传递一个模板参数:

$ mktemp /tmp/foo-XXXXX
/tmp/foo-J5BMk

该模板至少需要指定三个“X”模板字符。

mktemp提供了更多的模板选项,包括添加后缀和指定创建文件的目录。

3.3. 访问文件

如果我们在 shell 脚本中创建一个临时文件,我们通常会想要访问该文件。为此,我们可以将路径分配给变量。

让我们看一个示例,展示如何使用我们刚刚在脚本中创建的文件:

TMPFILE=$(mktemp /tmp/foo-XXXXX)
echo "Hello world" >> $TMPFILE  # Append some text to the file
cat $TMPFILE                    # Print the contents of the file
rm $TMPFILE                     # Delete the file

请记住,每次我们运行脚本时,它都会创建一个新文件。

3.4. 使用trap命令删除文件

当保存大的临时文件时,我们可能想要做一些内务处理,以防我们的脚本失败。

我们可以使用**trap 命令来做到这一点,它允许我们在检测到退出代码时运行一些代码**:

TMPFILE=$(mktemp /tmp/foo-XXXXXX)
trap "rm -f $TMPFILE" EXIT
# Our smart code

在上面的示例中,只要检测到EXIT信号,就会运行删除TMPFILE的代码。

通过在命令行输入trap -l,我们将找到可以被trap命令使用的可用信号列表。

4. POSIX兼容版本

不幸的是,mktemp实用程序并不总是可用,因为它不是 POSIX 规范的一部分。 相反,POSIX 将mkstemp函数指定为C API 的一部分:

mkstemp(template)函数应创建一个具有从**模板派生的唯一名称的常规文件,并为打开的文件返回一个文件描述符以供读取和写入。

该功能由GNU M4 宏处理器 作为宏实现。GNU M4 宏处理器在扩展其中的任何宏标记后,将每个输入文本复制到输出。

我们可以使用这个工具来创建我们的自制版本的mktemp实用程序:

$ echo 'mkstemp(/tmp/foo-XXXXXX)' | m4
/tmp/foo-dormh3

此版本与 POSIX 兼容,其行为与mktemp实用程序完全相同:

TMPFILE=$(echo 'mkstemp(/tmp/foo-XXXXXX)' | m4)
echo "Hello world" >> $TMPFILE # Append some text to the file
cat $TMPFILE                   # Print the contents of the file
rm $TMPFILE                    # Delete the file