我有一个脚本需要为其工作创建临时文件,并自行清理。我的问题是如何为临时文件找到正确的基目录。
该脚本需要在多个平台上运行:Git Bash (Windows)、Solaris、Linux、OSX。在每个平台上,首选临时目录的表达方式不同:
- Windows:(
%TMP%
可能%TEMP%
) - 操作系统:
$TMPDIR
- Linux、UNIX:应该是
$TMPDIR
,但在我尝试过的多个系统上似乎未设置
所以在我的脚本中我添加了这个样板:
if test -d "$TMPDIR"; then
:
elif test -d "$TMP"; then
TMPDIR=$TMP
elif test -d /var/tmp; then
TMPDIR=/var/tmp
else
TMPDIR=/tmp
fi
这似乎太乏味了。有没有更好的办法?
答案1
处理临时文件的一种稍微更便携的方法是使用mktemp
.它将创建临时文件并为您返回它们的路径。例如:
$ mktemp
/tmp/tmp.zVNygt4o7P
$ ls /tmp/tmp.zVNygt4o7P
/tmp/tmp.zVNygt4o7P
您可以很容易地在脚本中使用它:
tmpfile=$(mktemp)
echo "Some temp. data..." > $tmpfile
rm $tmpfile
阅读手册页,您应该能够根据您的需要设置选项。例如:
-d
创建一个目录而不是文件。-u
生成一个名称,但不创建任何东西。
使用-u
您可以轻松地检索临时目录...
$ tmpdir=$(dirname $(mktemp -u))
关于 Mac OS X 的编辑:我从未使用过 Mac OSX 系统,但根据下面 Tyilo 的评论,Mac OSX 似乎mktemp
要求您提供模板(这是 Linux 上的可选参数)。引用:
模板可以是任何附加有一定数量“X”的文件名,例如
/tmp/temp.XXXX
.尾随的“X”将替换为当前进程号和/或唯一的字母组合。 mktemp 可以返回的唯一文件名的数量取决于提供的“X”的数量;六个“X”将导致 mktemp 选择 56800235584 (62 ** 6) 个可能的文件名中的 1 个。
手册页还指出,此实现的灵感来自于 OpenBSD 手册页mktemp
。因此,OpenBSD 和 FreeBSD 用户也可能观察到类似的差异(请参阅历史部分)。
现在,正如您可能注意到的那样,这要求您指定完整的文件路径,包括您在问题中查找的临时目录。这个小问题可以用-t
开关来解决。虽然此选项似乎需要一个参数 ( ),但在必要时prefix
似乎会mktemp
依赖。$TMPDIR
总而言之,您应该能够使用以下命令获得与上面相同的结果...
$ tmpdir=$(dirname $(mktemp tmp.XXXXXXXXXX -ut))
来自 Mac OS X 用户的任何反馈将不胜感激,因为我无法自己测试这个解决方案。
答案2
如果您正在以更少的行数寻找相同的东西......
for TMPDIR in "$TMPDIR" "$TMP" /var/tmp /tmp
do
test -d "$TMPDIR" && break
done
你可以把这个写成一篇。
答案3
你可能会这样做:
: "${TMPDIR:=${TMP:-$(CDPATH=/var:/; cd -P tmp)}}"
cd -- "${TMPDIR:?NO TEMP DIRECTORY FOUND!}" || exit
shell 应该在 4 个替代方案之一中找到可执行目录,或者退出并显示有意义的错误。尽管如此,POSIX 定义了$TMPDIR
变量(对于 XCU 系统):
TMPDIR
该变量应表示可供需要创建临时文件的位置的程序使用的目录的路径名。
它还需要/tmp
路径。