如何在 Linux 上使用 mktemp 创建临时文件
临时文件和目录非常重要:例如,它们可以在 shell 脚本中使用,用于存储完成某些任务所需的信息,并且在工作完成后可以安全地删除它们。在本教程中,我们将了解如何在 Linux 上使用 mktemp
实用程序安全地创建临时文件和目录。
在本教程中您将学习:
如何使用 mktemp
如何为临时文件名提供自定义模板
如何为临时文件指定替代目录
如何创建临时目录
使用的软件要求和约定
介绍 mktemp
mktemp 实用程序允许我们安全地创建使用预定义或可选的用户提供的“模板”命名的临时文件和目录。该实用程序默认安装在所有主要 Linux 发行版上,通常作为“coreutils”软件包的一部分,因此即使在最小安装中也包含它。
在最基本的用法中,可以在不指定任何参数或选项的情况下调用它。当以这种方式使用时,它会在 /tmp
目录中创建一个临时文件。
为了安全地创建临时文件或目录,其名称不应与已存在的名称冲突。为了确保不会发生这种情况,mktemp
使用以下模板:
tmp.XXXXXXXXXX
模板中的 X
字符将替换为随机字符和数字。让我们尝试调用 mktemp
并看看我们得到什么结果:
$ mktemp
/tmp/tmp.too2NcMWqn
正如您所注意到的,默认情况下,mktemp
在 /tmp
目录中创建一个临时文件(要创建临时目录,我们应该使用稍后将看到的特定选项)使用上述命名模板。
创建的文件的名称打印在标准输出上;这使我们能够将它用作变量的值,我们可以使用它来引用它以进行后续操作:向其中写入内容,或者在执行脚本任务后将其删除。
为临时文件名提供自定义模板
我们刚刚看到了 mktemp 用于安全创建临时文件的默认命名模板。但是,如果我们愿意,我们有机会提供自定义命名模板:我们所要做的就是调用应用程序并将我们的自定义模板模式作为参数传递。要被视为有效,提供的模板必须至少包含 3 个 X
字符,正如我们所见,这些字符将被随机字符替换。如果不遵守此规则,则会生成错误:
$ mktemp customtemplatename.XX
mktemp: too few X's in template ‘customtemplatename.XX’
指定临时文件的替代目录
正如我们已经说过的,如果没有另外指定,临时文件和目录将由 mktemp
在 /tmp
系统目录中创建。这是有道理的,因为它是默认存储临时文件的位置。然而,在某些情况下,我们可能想要指定不同的路径。我们基本上可以通过两种方式来做到这一点:
使用
TMPDIR
环境变量调用 mktemp 时使用
--tmpdir
选项
让我们探讨一下这些选项。
使用 TMPDIR 变量
如果我们想要设置用于临时文件和目录的替代路径,而不必在每次调用应用程序时指定它,则建议为 TMPDIR
环境变量分配一个值。例如,我们可以在 ~/.profile
或 ~/.bash_profile
文件中设置此变量的值(取决于我们使用的 shell)。
假设我总是想使用 /customtempdir
目录来存放 mktemp
创建的临时文件。在 ~/.bash_profile
文件中,我将附加以下内容:
export TMPDIR="/customtempdir"
您可能知道,环境变量名称通常使用大写字母,这就是使用 TMPDIR
的原因。在上面的示例中,我们为变量赋值,但我们还使用了 export
shell 内置函数,为什么呢?它用于使变量在 shell 的所有子进程的环境中可用。在上面的示例中,我们导出并为同一行中的变量赋值,但我们也可以编写:
TMPDIR="/customtempdir"
export TMPDIR
指定的目录应该已经存在并且已应用适当的权限集。它不会由 mktemp
即时创建,并且所有应该使用它的人都应该可以写入。如果我们检查应用于默认 /tmp
目录的权限,这一点就会很明显:
$ ls -ld /tmp
drwxrwxrwt. 22 root root 520 Dec 22 12:45 /tmp
从 ls
的输出中可以看出,该目录由 root
用户和 root
组拥有,但可由以下用户写入和探索大家。 ls
生成的权限报告中的最后一个 t
表示已设置粘性位,因此在该目录中创建的所有文件只能由其所有者修改。请记住,我们可以通过运行以下命令轻松地在目录上设置粘滞位:
$ sudo chown o+t /path/to/the/directory
为了使对环境的更改生效,我们需要从系统登录注销,或者使用 source
立即(暂时 – 当我们关闭当前 shell 时,更改将丢失)重新获取源文件(~/.bash_profile
,在本例中):
$ source ~/.bash_profile
一旦变量成为环境的一部分,它的值将被 mktemp 用作创建临时文件和目录的目标目录:
$ mktemp
/customtempdir/tmp.JXuNpunTUm
使用 –tmpdir 选项
我们可以指定应在其中创建临时文件和目录的替代目录的另一种方法是在运行时使用 --tmpdir
选项 (-p
)。该选项采用我们要用作参数的目录路径。例如,要以这种方式使用 /customtempdir
目录,我们将运行:
$ mktemp --tmpdir=/customtempdir
或者
$ mktemp -p /customtempdir
创建临时目录
正如我们在前面的示例中看到的,默认情况下,mktemp
实用程序会创建临时文件。然而,在某些情况下,我们可能想创建临时目录。我们怎样才能做到呢?这非常简单:我们所要做的就是使用 -d
选项调用该实用程序,这是 --directory
的简短版本。用于临时文件名的相同模式也用于目录:
$ mktemp -d
/tmp/tmp.YKQDLww3kT
结束语
有时需要安全地创建临时文件和目录的能力,特别是通过应存储临时信息的 shell 脚本。在本教程中,我们了解了如何在 Linux 上使用 mktemp
实用程序执行此类任务:我们了解了用于命名临时文件的默认模板是什么,以及如何提供自定义模板、如何指定应该在哪个目录中创建它们(默认为 /tmp
),最后我们看到了如何创建临时目录而不是常规文件。