Contents

Linux中的mktemp命令简介

1. 概述

很多时候,当我们编写应用程序时,我们需要一个临时文件 或目录。mktemp  提供了一种基于系统的方法来从脚本或应用程序创建有效且唯一的临时文件或目录。

在本教程中,我们将介绍一种使用mktemp在 Linux 上安全可靠地创建临时文件和目录的方法 。

2. 创建临时文件

假设我们正在启动一个新的 Bash 脚本来创建和填充一些临时文件:

#!/bin/bash
for f in 1 2 3
do
  cat "My contents of $f" >> "file_$f.txt"
done

这将在我们从中执行脚本的任何目录中创建文件:

-rw-r--r--  1 alex  staff     24 Feb 13 15:38 file_1.txt
-rw-r--r--  1 alex  staff     24 Feb 13 15:38 file_2.txt
-rw-r--r--  1 alex  staff     24 Feb 13 15:38 file_3.txt

使用这个,我们可能会遇到几个问题。首先,为了不出错地运行,我们需要在当前目录中具有写权限。我们程序的多个实例可能会出现第二个问题。每个实例都有可能会冲突或覆盖文件。为避免上述问题,让我们 对临时文件使用mktemp

3. 对临时文件使用mktemp

让我们更新脚本以使用mktemp

#!/bin/bash
for f in 1 2 3
do
  file=$(mktemp)
  echo "Writing file $file"
  echo "My Contents" >> $file
done

执行它,我们看到:

$ ./example.sh 
Writing file /tmp/tmp.f3LkRe1i
Writing file /tmp/tmp.gxknRBeE
Writing file /tmp/tmp.lEzSU838

通过使用 mktemp,我们可以创建唯一的临时文件。此外,我们可以确保我们将在不同的系统上获得相同的功能mktemp将使用系统定义的临时目录。再次运行脚本,我们可以看到生成了三个新的、唯一的文件:

$ ./example.sh 
Writing file /tmp/tmp.pf60Klk6
Writing file /tmp/tmp.qjosdpxw
Writing file /tmp/tmp.jh8LWOxU

所以现在我们有了三个具有唯一名称的临时文件,但是我们丢失了我们的命名方案。幸运的是,mktemp有两个选项可以让我们更多地自定义我们的文件。

4. 使用名称模板

将*-t选项与mktemp*一起使用 允许我们为临时文件定义前缀。这为我们提供了一种不同的方式来将一些组织添加到我们的临时文件中。让我们更新我们的脚本来试试看:

#!/bin/bash
for f in 1 2 3
do
  file=$(mktemp -t file_${f})
  echo "Writing file $file"
  echo "My Contents" >> $file
done

请注意,在这种情况下,${f}不需要使用-t。这是为了将我们的循环变量放入我们的文件名模板中。 让我们运行脚本:

$ ./example.sh 
Writing file /tmp/file_1.YJkLELJh
Writing file /tmp/file_2.fluURpHx
Writing file /tmp/file_3.vGEiJ7Kt

这在独特的文件中为我们提供了类似的命名方案,但仍然不是我们正在寻找的。

5. 对临时目录使用 mktemp

为了保留我们的命名方案同时利用唯一的临时位置,让我们尝试使用 mktemp创建一个临时目录。它为我们提供了一个特定于进程的位置来放置我们的临时文件。它还使我们能够通过在末尾删除整个目录而不是跟踪所有单个文件来自行清理。让我们更新我们的脚本以创建一个临时目录(使用*-d*)并使用原始名称写入我们的文件:

#!/bin/bash
dir=$(mktemp -d)
for f in 1 2 3
do
  file=file_$f.txt
  echo "Writing file $file to dir $dir"
  echo "My Contents" >> "$dir/$file"
done

这将创建我们的原始文件名,但位于一个唯一的临时位置:

$ ls -lt /tmp/tmp.qFwNKUqt
total 24
-rw-r--r--  1 alex  staff  12 Feb 13 16:50 file_3.txt
-rw-r--r--  1 alex  staff  12 Feb 13 16:50 file_2.txt
-rw-r--r--  1 alex  staff  12 Feb 13 16:50 file_1.txt

完成后,我们可以在脚本末尾使用rm -r $dir删除目录。或者,系统处理临时文件最终会清理它。