我试图理解斯蒂芬·基特的回答对于这个问题,他使用以下代码创建了一个临时目录:
#!/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
gettimeofday
、getpid
、...等函数为您创建目录,以获得名称唯一性。