2010-03-10 15 views
11

Piszę skrypt powłoki i muszę utworzyć plik tymczasowy z pewnym rozszerzeniem.Jak mogę utworzyć plik tymczasowy o określonym rozszerzeniu w bash?

Próbowałem

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

i

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

ani praca, jako pierwsza tworzy nazwę pliku z dosłownym „xxxxxx”, a drugi nie daje opcję dla rozbudowa.

Potrzebuję rozszerzenia, aby podgląd nie odmówił otwarcia pliku.

Edit: skończyło się dzieje z połączeniem PID i mktemp w co mam nadzieję, że jest bezpieczna:

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

To jest podatny na atak Denial of Service, ale ja nic nie myśleć bardziej dotkliwy.

Odpowiedz

9

Najnowsze wersje oferta 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 

wierzę wymaga Coreutils> = 8 lub więcej.

Jeśli utworzysz plik tymczasowy (starsza wersja mktemp) bez sufiksu i zmienisz jego nazwę, aby dodać jeden, najprawdopodobniej sprawdź, czy plik już istnieje. Nie chroni cię to przed warunkami wyścigowymi, ale chroni cię, jeśli istnieje już taki plik, który był tam od jakiegoś czasu.

+1

FYI: * * BSD mktemp w Mac OSX ma ta opcja, przynajmniej nie w 10.11. – Jokester

+1

@ Nazwa Jokester nie jest kłamstwem. I przez to mam na myśli OSX/macOS robi * nie * ma '--suffix', wciąż od 10.12. –

+0

@ CharlieGorichanaz My bad. Zgaduję, że próbowałem napisać "nie ma tej opcji", ponieważ wciąż pamiętam debugowanie mojego skryptu w OSX dla tej różnicy :(. – Jokester

3

Jak o tym jednym:

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

MacOS Sierra 10.12 nie ma --suffix opcji, więc proponuję obejście:

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