Yo uso para crear un tempfile
, eliminarlo y volver a crearlo como un directorio:
tmpnam=`tempfile`
rm -f $tmpnam
mkdir "$tmpnam"
El problema es que otro proceso puede obtener el mismo nombre X
si accidentalmente ejecuta tempfile después de un proceso rm -f X
y justo antes mkdir X
.
bash
temporary-directory
Xiè Jìléi
fuente
fuente
mktemp -d -t <prefix>
Para una solución más robusta, uso algo como lo siguiente. De esa forma, el directorio temporal siempre se eliminará después de que salga el script.
La función de limpieza se ejecuta en la
EXIT
señal. Eso garantiza que siempre se llama a la función de limpieza, incluso si el script aborta en alguna parte.Directorio de script bash desde aquí .
Bash trampas .
fuente
cleanup
será rm-rf su directorio actual!mktemp
falla,WORK_DIR
estará vacío, lo que significa que el comando simplemente no tendrárm -rf
argumento. No uso FreeBSD pero estaría bastante sorprendido sirm -rf
fuera equivalente arm -rf .
TMPWORKDIR=$(basename 'mktemp -d -p /tmp/git/')
y luego 2rmdir /tmp/git/"${TMPWORKDIR}"
.. Si la variable está vacía ahora, aún no recurrirá/tmp/git/
a todo el sistema. Considere algo como esto en la respuesta y con mucho gusto estaré de acuerdo. ;)Mi frase favorita para esto es
fuente
rm $(pwd)
? : Ppushd $(mktemp -d)
...popd
rm -r $(pwd)
rm -r $(pwd)
. Considere la posibilidad de que la creación de directorio temporal falle por cualquier razón (¿tal vez el sistema de archivos / tmp está lleno o se ha vuelto a montar de solo lectura debido a un error?); luegocd $(mktemp -d)
evaluará acd
qué cambios en el directorio de inicio del usuario, que posteriormente se eliminarán.if pushd $(mktemp -d || echo BADMPDIR); then ........ ; rm -r $(pwd); popd; fi
El siguiente fragmento creará de forma segura un directorio temporal (
-d
) y almacenará su nombre enTMPDIR
. (Un ejemplo de uso deTMPDIR
variable se muestra más adelante en el código donde se usa para almacenar archivos originales que posiblemente se modificarán).La primera
trap
línea ejecuta elexit 1
comando cuando se recibe cualquiera de las señales especificadas . La segundatrap
línea elimina (limpia) la$TMPDIR
salida del programa (tanto normal como anormal). Inicializamos estas trampas después de comprobar que semkdir -d
logró evitar accidentalmente ejecutar la trampa de salida$TMPDIR
en un estado desconocido.fuente
-d
busca directorios. 2.) La terminación ya es el valor predeterminado para esas señales.