Respuestas:
Uso mktemp -d
. Crea un directorio temporal con un nombre aleatorio y se asegura de que el archivo no exista. Sin embargo, debe recordar eliminar el directorio después de usarlo.
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.
#!/bin/bash
# the directory of the script
DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
# the temp directory used, within $DIR
# omit the -p parameter to create a temporal directory in the default location
WORK_DIR=`mktemp -d -p "$DIR"`
# check if tmp dir was created
if [[ ! "$WORK_DIR" || ! -d "$WORK_DIR" ]]; then
echo "Could not create temp dir"
exit 1
fi
# deletes the temp directory
function cleanup {
rm -rf "$WORK_DIR"
echo "Deleted temp working directory $WORK_DIR"
}
# register the cleanup function to be called on the EXIT signal
trap cleanup EXIT
# implementation of script starts here
...
Directorio de script bash desde aquí .
Bash trampas .
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 si rm -rf
fuera equivalente arm -rf .
TMPWORKDIR=$(basename 'mktemp -d -p /tmp/git/')
y luego 2 rmdir /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
cd $(mktemp -d)
rm $(pwd)
? : P
pushd $(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?); luego cd $(mktemp -d)
evaluará a cd
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 en TMPDIR
. (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 el exit 1
comando cuando se recibe cualquiera de las señales especificadas . La segunda trap
línea elimina (limpia) la $TMPDIR
salida del programa (tanto normal como anormal). Inicializamos estas trampas después de comprobar que se mkdir -d
logró evitar accidentalmente ejecutar la trampa de salida $TMPDIR
en un estado desconocido.
#!/bin/bash
# Create a temporary directory and store its name in a variable ...
TMPDIR=$(mktemp -d)
# Bail out if the temp directory wasn't created successfully.
if [ ! -e $TMPDIR ]; then
>&2 echo "Failed to create temp directory"
exit 1
fi
# Make sure it gets removed even if the script exits abnormally.
trap "exit 1" HUP INT PIPE QUIT TERM
trap 'rm -rf "$TMPDIR"' EXIT
# Example use of TMPDIR:
for f in *.csv; do
cp "$f" "$TMPDIR"
# remove duplicate lines but keep order
perl -ne 'print if ++$k{$_}==1' "$TMPDIR/$f" > "$f"
done
-d
busca directorios. 2.) La terminación ya es el valor predeterminado para esas señales.
mktemp -d -t <prefix>