Odpowiedzi:
Zastosowanie mktemp -d
. Tworzy katalog tymczasowy o losowej nazwie i upewnia się, że plik jeszcze nie istnieje. Trzeba jednak pamiętać o usunięciu katalogu po jego użyciu.
Aby uzyskać bardziej niezawodne rozwiązanie, używam czegoś takiego jak poniżej. W ten sposób katalog tymczasowy będzie zawsze usuwany po zakończeniu skryptu.
Funkcja czyszczenia jest wykonywana na EXIT
sygnale. To gwarantuje, że funkcja czyszczenia jest zawsze wywoływana, nawet jeśli skrypt gdzieś przerywa.
#!/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
...
Katalog skryptu bash stąd .
Pułapki Bash .
cleanup
będą rm -rf aktualny katalog!
mktemp
nie powiedzie, WORK_DIR
będzie puste, co oznacza, że polecenie po prostu nie byłoby rm -rf
argumentów. Nie używam FreeBSD, ale byłbym bardzo zaskoczony, gdyby rm -rf
był równoważnyrm -rf .
TMPWORKDIR=$(basename 'mktemp -d -p /tmp/git/')
a następnie 2 rmdir /tmp/git/"${TMPWORKDIR}"
.. Jeśli zmienna jest teraz pusta, nadal będziesz wracał do /tmp/git/
całego systemu. Rozważ coś takiego w odpowiedzi i chętnie się zgodzę. ;)
Moim ulubionym do tego celu jest
cd $(mktemp -d)
rm $(pwd)
? : P
pushd $(mktemp -d)
...popd
rm -r $(pwd)
rm -r $(pwd)
. Rozważ możliwość, że utworzenie katalogu tymczasowego nie powiedzie się z jakiegokolwiek powodu (może system plików / tmp jest pełny lub został ponownie zamontowany tylko do odczytu z powodu błędu?); następnie cd $(mktemp -d)
oceni, cd
które zmiany w katalogu osobistym użytkownika zostaną następnie usunięte.
if pushd $(mktemp -d || echo BADMPDIR); then ........ ; rm -r $(pwd); popd; fi
Poniższy fragment kodu bezpiecznie utworzy katalog tymczasowy ( -d
) i zapisze jego nazwę w katalogu TMPDIR
. (Przykładowe użycie TMPDIR
zmiennej pokazano później w kodzie, w którym jest ona używana do przechowywania oryginalnych plików, które zostaną ewentualnie zmodyfikowane).
Pierwszy trap
wiersz wykonuje exit 1
polecenie po odebraniu dowolnego z określonych sygnałów . Druga trap
linia usuwa (czyści) $TMPDIR
wyjście z programu (zarówno normalne, jak i nienormalne). Inicjujemy te pułapki po sprawdzeniu, czy mkdir -d
udało się uniknąć przypadkowego uruchomienia pułapki wyjścia $TMPDIR
w nieznanym stanie.
#!/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
sprawdza katalogi. 2.) Terminacja jest już domyślna dla tych sygnałów.
mktemp -d -t <prefix>