Solución o alternativa para mktemp en OS X

Estoy viendo un script bash que alguien más escribió que usa mktemp :

 TEMP=`mktemp --directory` 

Sin embargo, esta línea no funciona en mi máquina (OS X 10.6).

¿Cómo arreglaría esta línea para que sea compatible con cross-un * x-like-platform? EDITAR: Un command alternativo sería suficiente también.

Lo siguiente fue lo que terminé usando para crear de manera confiable un directory temporal que funciona tanto en Linux como en Darwin (todas las versiones anteriores a Mac OS X 10.11), sin hardcoding $TMPDIR o /tmp :

 mytmpdir=`mktemp -d 2>/dev/null || mktemp -d -t 'mytmpdir'` 

Fondo:

El command GNU mktemp no requiere arguments. Plain mktemp creará un file temporal en el directory temporal del sistema.

Plain mktemp -d creará un directory temporal, que es lo que le gustaría usar en Linux.

 (gnu-coreutils)$ man mktemp # If DIR is not specified, uses $TMPDIR if set, else /tmp. 

De forma pnetworkingeterminada, utiliza la plantilla tmp.XXXXXXXXXX expandida en relación con el directory temporal pnetworkingeterminado.

El command mktemp de OSX requiere esta plantilla, no tiene ningún valor pnetworkingeterminado. La syntax de la plantilla en OSX es compatible con la de GNU. El mktemp de OSX tiene una opción -t que significa algo más. La opción -t está documentada como "prefijo". Se expande a $TMPDIR/{prefix}.XXXXXXXX , por lo que agrega las X a él automáticamente (por ejemplo, mktemp -d -t example podría crear $TMPDIR/example.zEJZWCTQ ).

Me sorprendió descubrir que en varios entornos Linux, $TMPDIR no está configurado por defecto (muchas herramientas lo admiten cuando se configura, pero aún tienen que ajustarse a /tmp ). Lo que significaba pasar $TMPDIR/example.XXXXXXXX a mktemp o mkdir no era una opción (ya que haría que la ruta terminara como un subdirectory del directory raíz).

En OSX $TMPDIR siempre está configurado y (al less en el shell pnetworkingeterminado) no está configurado en /tmp (que es un enlace simbólico a /private/tmp ) sino a /var/folders/dx/*****_*************/T Entonces deberíamos honrar eso si podemos.

En conclusión, lo siguiente fue lo que terminé usando para crear de manera confiable un directory temporal que funciona tanto en Linux como en Darwin (Mac OS X), sin hardcoding $TMPDIR o /tmp :

 mytmpdir=`mktemp -d 2>/dev/null || mktemp -d -t 'mytmpdir'` 

La primera parte es para Linux. Este command fallará en Darwin (Mac OS X) con el código de estado de error 1 respondiendo con "uso: …". Es por eso que ignoramos stderr y en su lugar, ejecutamos la variante Mac. El prefijo mytmpdir solo se usa en Mac.

Tienes que proporcionar una plantilla. mktemp -d /tmp/foo.XXXX debería funcionar. Nunca he visto --directory . El -- sugiere que es una extensión de GNU.

Cambiar --directory a -d . El primero es un GNU-ismo, pero GNU mktemp de coreutils también admite -d . El mktemp en 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 un progtwig mktemp .

 temp_dir="$(mktemp -q -d -t "$(basename "$0").XXXXXX")" 
  • mktemp para BSD (incluido OSX ) requiere una plantilla, pero permite cualquier cantidad de X s en la plantilla.
  • (GNU) mktemp para Linux no requiere una plantilla, sin embargo, si se especifica una plantilla, el número de X s debe ser 6.

Tenga en count que -t está en desuso para GNU mktemp , por lo que un código más a testing de futuro sería

 temp_dir="$(mktemp -q -d -t "$(basename "$0").XXXXXX" 2>/dev/null || mktemp -q -d)"