使用 mktemp -d 或 mkdir 创建的目录之间是否存在编程差异?

使用 mktemp -d 或 mkdir 创建的目录之间是否存在编程差异?

我试图理解斯蒂芬·基特的回答对于这个问题,他使用以下代码创建了一个临时目录:

#!/bin/bash

scripttmp=$(mktemp -d) # Create a temporary directory (these will usually be created under /tmp or /var/tmp/)

每次运行此命令时,我都会看到在下面创建一个新的临时目录/tmp/(我不知道它会出现在那里,直到阅读 Roaima 的答案)这里):

IIUC,常规目录与临时目录之间没有编程差异(唯一的区别在于这些目录的使用方式,即每个目录在计算机上停留的时间)。

如果没有程序上的差异,为什么人们会mktemp -d更喜欢最小的呢mkdir

答案1

使用时mkdir,脚本必须确保它创建的目录的名称尚不存在。mkdir dirname如果dirname是当前目录中的现有名称,则使用它会出错。

创建临时目录(即比当前脚本的生命周期长的不需要的目录)时,目录的名称通常并不重要,并且mktemp -d会找到尚未被其他内容占用的名称。

mktemp -d使创建临时目录变得更容易、更安全。如果没有mktemp -d,则必须尝试mkdir使用​​多个名称,直到有一个成功为止。这不仅不必要地复杂,而且可能会错误地完成(可能在代码中引入微妙的竞争条件)。

mktemp还为脚本用户提供了一些控制权,可以控制他们想要在何处创建临时目录。例如,如果脚本生成大量必须存储在该目录中的临时数据,则用户可以设置TMPDIR环境变量(在调用脚本之前或调用脚本时)以指向分区上的可写目录,其中有足够的可用空间。mktemp -d然后将在该路径下创建临时目录。

如果TMPDIR未设置,mktemp将用来/tmp代替。

答案2

由于它创建了一个随机名称的临时目录,所以问题mktemp -d是:如果您有严格的临时目录删除政策,则需要记住在使用该目录后删除该目录。

这就是为什么你写信scripttmp=$(mktemp -d)来保持价值。一般来说,它很容易使用。

除非您不在乎,否则您可以使用这个小示例来生成随机名称并稍后删除该文件夹:

var=$(cat /dev/urandom | tr -dc 'a-zA-Z0-9' | fold -w 20 | head -n 1);
mkdir "/tmp/$var"
#some code
rm -rf "/tmp/$var"

使用 mktemp -d 或 mkdir 创建的目录之间是否存在编程差异?

嗯,有。由mkdir您生成目录名称,mktemp -d系统根据/dev/urandom gettimeofdaygetpid、...等函数为您创建目录,以获得名称唯一性。

相关内容