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 EXITsegnale. 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 .
cleanupsarà rm -rf la directory corrente!
mktempfallisce, WORK_DIRsarà vuoto, il che significa che il comando sarebbe rm -rfsenza argomenti. Non uso FreeBSD ma sarei piuttosto sorpreso se rm -rffosse 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 cdquali 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 trapriga esegue il exit 1comando quando viene ricevuto uno qualsiasi dei segnali specificati . La seconda trapriga rimuove (pulisce) l' $TMPDIRuscita del programma (sia normale che anormale). Inizializziamo queste trap dopo aver verificato che è mkdir -driuscito a evitare di eseguire accidentalmente la trap di uscita con $TMPDIRuno 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
-dcontrolla le directory. 2.) La terminazione è già predefinita per quei segnali.
mktemp -d -t <prefix>