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).
mktemp -d
en OS X 10.11.5 El Capitan, y funcionó como se esperabafile $(mktemp -d)
:/var/folders/j4/htlnmbf97vlcdszj7_x8g0vh4k3_fp/T/tmp.JXmsrQnL: directory
mktemp -d -t 'mytmpdir'
Linux (probado conmktemp
fromcoreutils 8.26
), funciona como se esperaba.Tienes que proporcionar una plantilla.
mktemp -d /tmp/foo.XXXX
Deberia trabajar. Nunca he visto--directory
. El--
sugiere que es una extensión GNU.fuente
$TMPDIR
cuando esté disponible, hágalomktemp -d "${TMPDIR:-/tmp}"/foo.XXXX
. Eso funciona en bash en Mac y en Debian, por lo que parece portátil.Cambiar
--directory
a-d
. El primero es un GNU-ismo, pero GNUmktemp
de coreutils también es compatible-d
. Elmktemp
OS X es el mismo que el de BSD, por lo que-d
debería ser bastante portátil entre los sistemas que realmente envían unmktemp
programa.fuente
mktemp -d
, y tampoco funciona.mktemp
en OS X requiere una plantilla. El script que está utilizando asume las convenciones de GNU, que usa una plantilla predeterminada si no se proporciona ninguna.XXXXX
que se suministre en la plantilla, ya que OS X no está seguro de si hay una bandera de plantilla compatible.mktemp
en OS X 10.11.5 El Capitan funciona para mífile $(mktemp -d)
:/var/folders/j4/htlnmbf97vlcdszj7_x8g0vh4k3_fp/T/tmp.JXmsrQnL: directory
mktemp
para BSD (incluido OSX ) requiere una plantilla, pero permite cualquier número deX
s en la plantilla.mktemp
para Linux no requiere una plantilla, sin embargo, si se especifica una plantilla, el número deX
s debe ser 6.Tenga en cuenta que
-t
está en desuso para GNUmktemp
, por lo que un código más a prueba de futuro seríafuente