tutorial script comandos bourne again linux bash unix

linux - script - bourne again shell



¿Cuál es la diferencia entre tempfile y mktemp? (3)

La mayoría de los sistemas que he encontrado tienen tanto tempfile(1) como mktemp(1) . Hay diferencias sintácticas, y mktemp también puede crear directorios, pero por lo demás parecen hacer lo mismo.

¿Hay alguna diferencia entre los dos? ¿Por qué existen ambos? ¿Es una norma más que la otra? Si solo quiero crear un archivo temporal de forma segura, ¿hay alguna razón para preferir uno sobre el otro?

Sospecho que hay algo interesante de Unix detrás de esto, pero mis búsquedas no muestran nada.


Sospecho que hay una interesante historia de Unix detrás de esto ...

La history de mktemp se puede remontar a OpenBSD 2.1 . Sin embargo, se convirtió en parte de GNU coreutils mucho más tarde. This post anunció la inclusión de mktemp para coreutils .

Hasta entonces, tempfile estaba siendo utilizado por varios programas. También hubo una proposal para hacer que tempfile un envoltorio alrededor de mktemp , que fue rejected para desalentar el uso de tempfile .

Sin embargo, se agregó lo siguiente al manual tempfile :

La creación exclusiva no está garantizada al crear archivos en particiones NFS. tempfile no puede hacer directorios temporales. tempfile está en desuso deberías usar mktemp(1) lugar.


Desde la vista del código fuente de las cosas (en debian), tempfile es del paquete debianutils y usa la función libc tempnam() mientras que mktemp es de GNU coreutils y no usa la función libc


En el manual de tempfile se dice que:

tempfile - create a temporary file in a safe manner

Mientras que en mktemp:

mktemp - create a temporary file or directory

Probablemente sean casi iguales, solo que la implementación es un poco diferente.

Como se dijo en el manual, tempfile realidad tiene algunas precauciones como:

a) En caso de que la variable de entorno TMPDIR exista y contenga el nombre de un directorio apropiado, que se utilice.

b) De lo contrario, si se especifica el argumento --directory y es apropiado, se utiliza.

c) De lo contrario, se P_tmpdir (como se define en <stdio.h> ) cuando sea apropiado.

d) Finalmente se puede usar un directorio definido por la implementación ( /tmp ).

Es realmente útil si el script confía en mktemp o tempfile suficiente como para estar seguro de que se creará un archivo o directorio temporal. Pero no veo mucho problema simplemente usando mktemp si ejecuta las precauciones en su script usted mismo. Puede usar [ -e ] , [ -f ] , [ -d ] , [ -L ] , etc. para verificar si un archivo realmente se pudo hacer / ya se hizo. Incluso compruebe si algo es escribible, legible y / o ejecutable con -r, -w y -x. En bash, ver help test .

Sin embargo, por el bien del tiempo de ejecución continuo, es mejor que confíe en el tempfile al ejecutar su código en múltiples entornos. Solo asegúrate de que esté disponible en todas partes. Con which o con type -P puede comprobar cuál de ellos está disponible. Un ejemplo:

create_temp() { if type -P tempfile >/dev/null; then # use tempfile based from $1 elif type -P mktemp > /dev/null; then # use mktemp based from $1 else echo "Can''t find temporary file creator." exit 1 fi }