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

cob*_*bal 16 macos bash

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

我试过了

tempname=`basename $0`
TMPPS=`mktemp /tmp/${tempname}.XXXXXX.ps` || exit 1
Run Code Online (Sandbox Code Playgroud)

tempname=`basename $0`
TMPPS=`mktemp -t ${tempname}` || exit 1
Run Code Online (Sandbox Code Playgroud)

不起作用,因为第一个创建文字名称与文字"XXXXXX",第二个不提供扩展选项.

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

编辑:我最终使用pid和mktemp的组合,我希望是安全的:

tempname=`basename $0`
TMPTMP=`mktemp -t ${tempname}` || exit 1
TMPPS="$TMPTMP.$$.ps" 
mv $TMPTMP $TMPPS || exit 1
Run Code Online (Sandbox Code Playgroud)

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

bas*_*ic6 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
Run Code Online (Sandbox Code Playgroud)

我相信这需要coreutils> = 8左右.

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

  • @Jokester的名字不是骗人的.我的意思是OSX/macOS*不具有`--suffix`,仍然是10.12. (3认同)
  • 仅供参考:Mac OSX 中的 *BSD* mktemp 确实有此选项,至少在 10.11 中没有。 (2认同)
  • 对于未来的访问者:我的第一条评论是不正确的,请阅读为“BSD mktemp *没有*有这个选项”。 (2认同)

Luc*_*nze 6

除了 --suffix (并不总是可用)之外的所有这些解决方案都有竞争条件。您可以通过使用 mktemp -d 创建一个目录,然后将您的文件放在那里来消除竞争条件。

mydir=`mktemp -d`
touch "$mydir"/myfile.ps
Run Code Online (Sandbox Code Playgroud)


Ste*_*han 5

这个怎么样:

echo $(mktemp $TMPDIR/$(uuidgen).txt)
Run Code Online (Sandbox Code Playgroud)