How can I create a temp file with a specific extension in bash?

匿名 (未验证) 提交于 2019-12-03 08:35:02

问题:

I'm writing a shell script, and I need to create a temporary file with a certain extension.

I've tried

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

and

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

neither work, as the first creates a file name with a literal "XXXXXX" and the second doesn't give an option for an extension.

I need the extension so that preview won't refuse to open the file.

Edit: I ended up going with a combination of pid and mktemp in what I hope is secure:

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

It is vulnerable to a denial of service attack, but I don't think anything more severe.

回答1:

Recent versions of mktemp offer --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 

I believe this requires coreutils >= 8 or so.

If you create a temp file (older mktemp version) without suffix and you're renaming that to append one, the least thing you could probably do is check if the file already exists. It doesn't protect you from race conditions, but it does protect you if there's already such a file which has been there for a while.



回答2:

How about this one:

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


回答3:

MacOS Sierra 10.12 doesn't have --suffix option, so I suggest workaround:

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


标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!