Używam do tworzenia tempfile
, usuwania i ponownego tworzenia jako katalogu:
tmpnam=`tempfile`
rm -f $tmpnam
mkdir "$tmpnam"
Problem w tym, że inny proces może otrzymać tę samą nazwę X
, jeśli przypadkowo wykona plik tymczasowy po jednym procesie rm -f X
i tuż przed nim mkdir X
.
bash
temporary-directory
Xiè Jìléi
źródło
źródło
mktemp -d -t <prefix>
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.Katalog skryptu bash stąd .
Pułapki Bash .
źródło
cleanup
będą rm -rf aktualny katalog!mktemp
nie powiedzie,WORK_DIR
będzie puste, co oznacza, że polecenie po prostu nie byłobyrm -rf
argumentów. Nie używam FreeBSD, ale byłbym bardzo zaskoczony, gdybyrm -rf
był równoważnyrm -rf .
TMPWORKDIR=$(basename 'mktemp -d -p /tmp/git/')
a następnie 2rmdir /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
źródło
rm $(pwd)
? : Ppushd $(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ępniecd $(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 kataloguTMPDIR
. (Przykładowe użycieTMPDIR
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 wykonujeexit 1
polecenie po odebraniu dowolnego z określonych sygnałów . Drugatrap
linia usuwa (czyści)$TMPDIR
wyjście z programu (zarówno normalne, jak i nienormalne). Inicjujemy te pułapki po sprawdzeniu, czymkdir -d
udało się uniknąć przypadkowego uruchomienia pułapki wyjścia$TMPDIR
w nieznanym stanie.źródło
-d
sprawdza katalogi. 2.) Terminacja jest już domyślna dla tych sygnałów.