2010-03-10 17 views
11

Estoy escribiendo un script de shell y necesito crear un archivo temporal con una cierta extensión.¿Cómo puedo crear un archivo temporal con una extensión específica en bash?

He intentado

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

y

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

ni el trabajo, ya que el primero crea un nombre de archivo con un literal "XXXXXX" y el segundo no da una opción para una extensión.

Necesito la extensión para que la vista previa no se niegue a abrir el archivo.

Editar: Terminé yendo con una combinación de pid y mktemp en lo que espero es segura:

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

Es vulnerable a un ataque de denegación de servicio, pero no creo que nada más severo.

Respuesta

9

Las versiones recientes de 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 

creo que esto requiere coreutils> = 8 o así.

Si crea un archivo temporal (versión mktemp más antigua) sin sufijo y lo renombra para agregar uno, lo mínimo que probablemente podría hacer es verificar si el archivo ya existe. No lo protege de las condiciones de carrera, pero lo protege si ya hay un archivo que ha estado allí por un tiempo.

+1

su información: * * BSD mktemp en Mac OS X sí tiene esta opción, al menos no en 10.11. – Jokester

+1

@ El nombre de Jokester no es mentira. Y con eso me refiero a que OSX/macOS * no * tiene '--suffix', todavía a partir de 10.12. –

+0

@CharlieGorichanaz Mi mal. Supongo que estaba tratando de escribir "no tengo esta opción", porque todavía puedo recordar la depuración de mi script en OSX para esta diferencia :(. – Jokester

3

¿Qué tal este:

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

MacOS Sierra 10.12 no tiene --suffix opción, por lo que sugiero solución:

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