我正在编写一个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
它容易受到拒绝服务攻击,但我认为没有更严重的问题。
答案 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