Mientras ejecuto un script, quiero crear un archivo temporal en el /tmp
directorio.
Después de la ejecución de ese script, ese script lo limpiará.
¿Cómo hacer eso en el script de shell?
shell-script
tmp
Bhuvanesh
fuente
fuente
/proc
- excepto para sistemas que no lo tienen.exec 3> "$tmpfile"
hacer? ¿No es eso útil solo si tmpfile es un script independiente?cat <&3
daráBad file descriptor
. Le agradecería si lo arregla o lo elimina; la desinformación no ayuda mucho.Use
mktemp
para crear un archivo o directorio temporal:O para un direcotry:
Al final del script, debe eliminar el archivo / directorio temporal:
mktemp crea un archivo en el
/tmp
directorio o en el directorio dado con el--tmpdir
argumento.fuente
trap "rm -f $temp_file" 0 2 3 15
inmediatamente después de crear el archivo para que cuando el script salga o se detenga conctrl-C
el archivo, aún se elimine.EXIT
es el único gancho paratrap
?kill -9 $somepid
. Esa señal particular de muerte es muerte instantánea sin que nada más suceda.bash -c 'echo $$; trap "echo foo" 0; sleep 5'
EXIT
es suficiente.Si está en un sistema que tiene mktemp , debe usarlo como otras respuestas.
Con POSIX toolchest:
fuente
EXIT
es el único gancho paratrap
?tmpfile
aún se debe eliminar antes de la salida del script, pero no cuando el script recibió otras señales.That's not what happens
?mktemp
se originó en HP / UX con una sintaxis diferente. Todd C. Miller creó uno diferente para OpenBSD a mediados de los 90 (copiado por FreeBSD y NetBSD) y más tarde también lo hizo disponible como una utilidad independiente (www.mktemp.org). Ese es el que generalmente se usaba en Linux hasta quemktemp
se agregó una utilidad (en su mayoría compatible) a los coreutils de GNU en 2007. Solo para decir que uno realmente no puede decirmktemp
es una utilidad de GNU.Algunos proyectiles tienen la característica incorporada.
zsh
zsh
La=(...)
forma de sustitución del proceso utiliza un archivo temporal. Por ejemplo, se=(echo test)
expande a la ruta de un archivo temporal que contienetest\n
.Ese archivo se elimina automáticamente, una vez que el comando ha finalizado.
bash / zsh en Linux.
Here-files o here-strings in
bash
yzsh
se implementan como archivos temporales eliminados.Entonces si lo haces:
El descriptor de archivo 3 está conectado a un archivo temporal eliminado que contiene
test\n
.Puede obtener su contenido con:
Si está en Linux, también puede leer o escribir en ese archivo a través de
/dev/fd/3
(algunos otros depósitos usan tuberías, o pueden usarse
/dev/null
si el documento here está vacío).POSIX
No hay
mktemp
utilidad POSIX. POSIX, sin embargo, especifica unamkstemp(template)
API de C , y lam4
utilidad estándar expone esa API con lamkstemp()
función m4 con el mismo nombre.mkstemp()
le da un nombre de archivo con una parte aleatoria que se garantizó que no existía en el momento en que se llamó a la función. Sí crea el archivo con permisos 0600 de forma libre de carrera.Entonces, podrías hacer:
Sin embargo, tenga en cuenta que debe manejar la limpieza al salir, aunque si solo necesita escribir y leer el archivo un número fijo de veces, puede abrirlo y eliminarlo justo después de crearlo para here-doc / here- enfoque de cuerda arriba:
Puede abrir el archivo para leerlo una vez y rebobinar entre dos lecturas, sin embargo, no hay una utilidad POSIX que pueda rebobinar (
lseek()
), por lo que no puede hacerlo de forma portátil en un script POSIX (zsh
(sysseek
incorporado) yksh93
(<#((...))
operador) puede hazlo sin embargo).fuente
<()
=(...)
.Aquí hay una respuesta un poco mejorada en la línea de Hauke Laging:
fuente
Mi flujo de trabajo normalmente con archivos temporales se debe a algún script bash que estoy probando. Quiero
tee
hacerlo para poder ver que está funcionando y guardar la salida para la próxima iteración de mi proceso. He creado un archivo llamadotmp
para que pueda usarlo como
La razón por la que me gusta la fecha y hora formateada antes de los valores aleatorios es que me permite encontrar el archivo tmp que acabo de crear fácilmente, y no tengo que pensar en cómo nombrarlo la próxima vez (y centrarme en obtener mi script dang) trabajar).
fuente