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 Xsi accidentalmente ejecuta tempfile después de un proceso rm -f Xy 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
EXITseñ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
cleanupserá rm-rf su directorio actual!mktempfalla,WORK_DIRestará vacío, lo que significa que el comando simplemente no tendrárm -rfargumento. No uso FreeBSD pero estaría bastante sorprendido sirm -rffuera 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)...popdrm -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á acdqué cambios en el directorio de inicio del usuario, que posteriormente se eliminarán.if pushd $(mktemp -d || echo BADMPDIR); then ........ ; rm -r $(pwd); popd; fiEl siguiente fragmento creará de forma segura un directorio temporal (
-d) y almacenará su nombre enTMPDIR. (Un ejemplo de uso deTMPDIRvariable se muestra más adelante en el código donde se usa para almacenar archivos originales que posiblemente se modificarán).La primera
traplínea ejecuta elexit 1comando cuando se recibe cualquiera de las señales especificadas . La segundatraplínea elimina (limpia) la$TMPDIRsalida del programa (tanto normal como anormal). Inicializamos estas trampas después de comprobar que semkdir -dlogró evitar accidentalmente ejecutar la trampa de salida$TMPDIRen un estado desconocido.fuente
-dbusca directorios. 2.) La terminación ya es el valor predeterminado para esas señales.