2010-03-10 24 views
11

Bir kabuk komut dosyası yazıyorum ve belirli bir uzantıya sahip geçici bir dosya oluşturmam gerekiyor. İlk bir hazır "XXXXXX" ile bir dosya adı oluşturur ve ikinci bir için bir seçenek vermez gibi ben ne iş Bash'da belirli bir uzantıya sahip nasıl geçici dosya oluşturabilirim?

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

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

ve

denedim

uzantı.

Önizlemenin dosyayı açmayı reddetmesi için uzantıya ihtiyacım var.

Düzenleme: Ben umduğumuz pid ve mktemp kombinasyonu ile gidiş sona erdi güvenlidir:

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

Bu hizmet reddi saldırısı karşı savunmasız, ama hiçbir şey düşünmüyorum daha şiddetli. mktemp teklif --suffix ait

cevap

9

Son sürümleri:

--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 

Bu coreutils> = 8 ya da öylesine gerektirir inanıyoruz.

Geçici olmayan bir geçici dosya (eski mktemp sürümü) oluşturursanız ve bunu bir ekleme yapmak için yeniden adlandırıyorsanız, muhtemelen yapabileceğiniz en az şey dosyanın zaten mevcut olup olmadığını kontrol etmektir. Sizi yarış koşullarından korumaz, ancak bir süredir orada olan bir dosya varsa sizi korur.

+1

: * BSD * Mac OSX içinde mktemp var Bu seçenek, en azından 10.11'de değil. – Jokester

+1

@ Jokester'ın adı yalan değil. Ve bu demek oluyor ki OSX/macOS * 10 * 'dan *. –

+0

@CharlieGorichanaz Benim kötü. Sanırım "Bu seçenek yok" yazmaya çalışıyorum, çünkü OSX'deki betiğimi bu fark için hata ayıklamayı hala hatırlıyorum :(. – Jokester

3

kimse bu konuda nasıl:

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

MacOS Sierra 10.12 --suffix seçeneği yok, bu yüzden önermek geçici çözüm:

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