如何在bash中创建具有特定扩展名的临时文件?

时间:2010-03-10 19:09:52

标签: macos bash

我正在编写一个shell脚本,我需要创建一个具有特定扩展名的临时文件。

我试过

tempname=`basename $0`
TMPPS=`mktemp /tmp/${tempname}.XXXXXX.ps` || exit 1

tempname=`basename $0`
TMPPS=`mktemp -t ${tempname}` || exit 1

两者都不起作用,因为第一个文件名用文字“XXXXXX”创建,第二个文件名没有为扩展名提供选项。

我需要扩展名,以便预览不会拒绝打开文件。

编辑:我最终选择了pid和mktemp,我希望这是安全的:

tempname=`basename $0`
TMPTMP=`mktemp -t ${tempname}` || exit 1
TMPPS="$TMPTMP.$$.ps" 
mv $TMPTMP $TMPPS || exit 1

它容易受到拒绝服务攻击,但我认为没有更严重的问题。

6 个答案:

答案 0 :(得分:12)

mktemp的最新版本提供--suffix:

   --suffix=SUFF
          append SUFF to TEMPLATE.  SUFF must not contain slash.  This option is implied if TEMPLATE does not end in X.

$ mktemp /tmp/banana.XXXXXXXXXXXXXXXXXXXXXXX.mp3
/tmp/banana.gZHvMJfDHc2CTilINNuq2P0.mp3

我认为这需要coreutils> = 8左右。

如果您创建一个没有后缀的临时文件(较旧的mktemp版本)并且您要重命名它以附加一个,那么您可能做的最少的事情就是检查该文件是否已存在。它不能保护您免受竞争条件的影响,但如果已经有一段时间存在这样的文件,它确实可以保护您。

答案 1 :(得分:4)

这个怎么样:

echo $(mktemp $TMPDIR/$(uuidgen).txt)

答案 2 :(得分:4)

除--suffix(并非始终可用)之外,所有这些解决方案均具有竞争条件。您可以通过使用mktemp -d创建目录,然后将文件放在其中来消除竞争条件。

mydir=`mktemp -d`
touch "$mydir"/myfile.ps

答案 3 :(得分:1)

MacOS Sierra 10.12没有--suffix选项,所以我建议解决方法:

    tempname=`basename $0`
    TMPPS_PREFIX=$(mktemp "${TMPDIR:-/tmp/}${tempname}.XXXXXX")
    TMPPS=$(mktemp "${TMPPS_PREFIX}.ps")
    rm ${TMPPS_PREFIX}
    echo "Your temp file: ${TMPPS}"

答案 4 :(得分:0)

这是一种更具可移植性的解决方案(与POSIX兼容):

temp=$(mktemp -u).ps
: >"$temp"

第一行运行mktemp而不创建文件,然后将temp设置为生成的文件名并附加.ps。然后第二行创建它;如果愿意,可以改用touch "$temp"

编辑:请注意,这与使用shell重定向创建它的权限不同。如果您需要其他用户无法读取它,可以使用chmod进行手动设置。

答案 5 :(得分:0)

对于 macOS -

brew install coreutils

然后 -

gmktemp --suffix=.ps