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 usarmktemp(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
}