Risposte:
Usa mktemp -d
. Crea una directory temporanea con un nome casuale e si assicura che il file non esista già. Tuttavia, è necessario ricordare di eliminare la directory dopo averla utilizzata.
Per una soluzione più solida utilizzo qualcosa di simile al seguente. In questo modo la directory temporanea verrà sempre eliminata dopo la chiusura dello script.
La funzione di pulizia viene eseguita sul EXIT
segnale. Ciò garantisce che la funzione di pulizia sia sempre chiamata, anche se lo script si interrompe da qualche 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
...
Elenco di script bash da qui .
Bash trappole .
cleanup
sarà rm -rf la directory corrente!
mktemp
fallisce, WORK_DIR
sarà vuoto, il che significa che il comando sarebbe rm -rf
senza argomenti. Non uso FreeBSD ma sarei piuttosto sorpreso se rm -rf
fosse equivalente arm -rf .
TMPWORKDIR=$(basename 'mktemp -d -p /tmp/git/')
e quindi 2 rmdir /tmp/git/"${TMPWORKDIR}"
.. Se la variabile è vuota ora, si tornerà a /tmp/git/
non all'intero sistema. Considera qualcosa di simile nella risposta e sarò felice di essere d'accordo. ;)
Il mio one-liner preferito per questo è
cd $(mktemp -d)
rm $(pwd)
? : P
pushd $(mktemp -d)
...popd
rm -r $(pwd)
rm -r $(pwd)
. Considerare la possibilità che la creazione temporanea di directory non riesca per qualsiasi motivo (forse il filesystem / tmp è pieno o è stato rimontato in lettura solo a causa di un errore?); quindi cd $(mktemp -d)
valuterà a cd
quali modifiche alla home directory dell'utente, che verranno successivamente eliminate.
if pushd $(mktemp -d || echo BADMPDIR); then ........ ; rm -r $(pwd); popd; fi
Il frammento seguente creerà in modo sicuro una directory temporanea ( -d
) e memorizzerà il suo nome nel fileTMPDIR
. (Un esempio di utilizzo diTMPDIR
variabile viene mostrato più avanti nel codice in cui viene utilizzato per archiviare i file originali che potrebbero essere modificati.)
La prima trap
riga esegue il exit 1
comando quando viene ricevuto uno qualsiasi dei segnali specificati . La seconda trap
riga rimuove (pulisce) l' $TMPDIR
uscita del programma (sia normale che anormale). Inizializziamo queste trap dopo aver verificato che è mkdir -d
riuscito a evitare di eseguire accidentalmente la trap di uscita con $TMPDIR
uno stato sconosciuto.
#!/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
controlla le directory. 2.) La terminazione è già predefinita per quei segnali.
mktemp -d -t <prefix>