Lo siguiente es lo que terminé usando para crear de manera confiable un directorio temporal que funciona tanto en Linux como en Darwin (todas las versiones anteriores a Mac OS X 10.11), sin codificación $TMPDIR
o /tmp
:
mytmpdir=`mktemp -d 2>/dev/null || mktemp -d -t 'mytmpdir'`
Antecedentes:
El comando GNU mktemp no requiere argumentos. Plain mktemp
funcionará y creará un archivo temporal en el directorio temporal del sistema.
Plain mktemp -d
creará un directorio en lugar de un archivo, que es lo que querría usar en Linux.
(gnu-coreutils)$ man mktemp
> ..
> If DIR is not specified, uses $TMPDIR if set, else /tmp.
> ..
Por defecto, GNU mktemp usa la plantilla tmp.XXXXXXXXXX
para el nombre del subdirectorio (o archivo). Para personalizar esta plantilla, -t
se puede usar la opción.
Mktemp de OSX no tiene una plantilla predeterminada y requiere que se especifique una plantilla. Desafortunadamente, donde GNU mktemp toma la plantilla como -t
opción, en OSX esto se pasa como argumento posicional. En cambio, mktemp de OSX tiene una -t
opción que significa otra cosa. La -t
opción en OSX está documentada como un "prefijo" para la plantilla. Se expande a {prefix}.XXXXXXXX
, por lo que agrega las X automáticamente (por ejemplo, mktemp -d -t example
podría crear example.zEJZWCTQ
en el directorio temporal).
Me sorprendió descubrir que en muchos entornos Linux, no$TMPDIR
está configurado por defecto. Muchos programas CLI lo admiten cuando se configura, pero aún necesitan un valor predeterminado para . Esto significa que pasar a mktemp o mkdir es peligroso porque puede producirse en el directorio raíz del disco local (debido a que $ TMPDIR se desarma y se convierte en una cadena vacía)./tmp
$TMPDIR/example.XXXXXXXX
/example.XXXXXXXX
En OSX, $TMPDIR
siempre se establece y (al menos en el shell predeterminado) no se establece en /tmp
(que es un enlace simbólico /private/tmp
) sino en /var/folders/dx/*****_*************/T
. Entonces, hagamos lo que hagamos para OSX, debería honrar ese comportamiento predeterminado.
En conclusión, lo siguiente es lo que terminé usando para crear de manera fiable un directorio temporal que funciona tanto en Linux y Darwin (Mac OS X), sin codificar, ya sea $TMPDIR
o /tmp
:
mytmpdir=`mktemp -d 2>/dev/null || mktemp -d -t 'mytmpdir'`
La primera parte es para Linux. Este comando fallará en Darwin (Mac OS X) con un código de estado de error que 1
responde con "uso: ...". Es por eso que ignoramos stderr y en su lugar ejecutamos la variante Mac. El mytmpdir
prefijo solo se usa en Mac (donde se requiere establecer esa opción).