Ich erstelle ein tempfile
, lösche es und erstelle es als Verzeichnis neu:
tmpnam=`tempfile`
rm -f $tmpnam
mkdir "$tmpnam"
Das Problem ist, dass ein anderer Prozess möglicherweise denselben Namen erhält X
, wenn er versehentlich nach einem Prozess rm -f X
und kurz zuvor tempfile ausführt mkdir X
.
bash
temporary-directory
Xiè Jìléi
quelle
quelle
mktemp -d -t <prefix>
Für eine robustere Lösung verwende ich so etwas wie das Folgende. Auf diese Weise wird das temporäre Verzeichnis nach dem Beenden des Skripts immer gelöscht.
Die Bereinigungsfunktion wird für das
EXIT
Signal ausgeführt. Das garantiert, dass die Bereinigungsfunktion immer aufgerufen wird, auch wenn das Skript irgendwo abgebrochen wird.Verzeichnis des Bash-Skripts von hier .
Bash Fallen .
quelle
cleanup
wird rm -rf Ihr aktuelles Verzeichnis!mktemp
fehlschlägt,WORK_DIR
ist es leer, was bedeutet, dass der Befehl nurrm -rf
ohne Argument ist. Ich benutze kein FreeBSD, aber ich wäre ziemlich überrascht, wennrm -rf
es gleichbedeutend wäre mitrm -rf .
TMPWORKDIR=$(basename 'mktemp -d -p /tmp/git/')
und dann 2rmdir /tmp/git/"${TMPWORKDIR}"
.. Wenn die Variable jetzt leer ist, werden Sie immer noch/tmp/git/
auf das gesamte System zurückgreifen . Betrachten Sie so etwas in der Antwort und ich werde gerne zustimmen. ;)Mein Lieblings-Einzeiler dafür ist
quelle
rm $(pwd)
? : Ppushd $(mktemp -d)
...popd
rm -r $(pwd)
rm -r $(pwd)
. Berücksichtigen Sie die Möglichkeit, dass die temporäre Verzeichniserstellung aus irgendeinem Grund fehlschlägt (möglicherweise ist das Dateisystem / tmp voll oder wurde aufgrund eines Fehlers schreibgeschützt erneut bereitgestellt?). Anschließendcd $(mktemp -d)
wird ausgewertet,cd
welche Änderungen am Home-Verzeichnis des Benutzers vorgenommen werden, die anschließend gelöscht werden.if pushd $(mktemp -d || echo BADMPDIR); then ........ ; rm -r $(pwd); popd; fi
Das folgende Snippet erstellt sicher ein temporäres Verzeichnis (
-d
) und speichert seinen Namen imTMPDIR
. (Eine beispielhafte Verwendung vonTMPDIR
Variablen wird später im Code gezeigt, wo sie zum Speichern von Originaldateien verwendet wird, die möglicherweise geändert werden.)Die erste
trap
Zeile führt denexit 1
Befehl aus, wenn eines der angegebenen Signale empfangen wird. In der zweitentrap
Zeile wird$TMPDIR
der Exit des Programms (sowohl normal als auch abnormal) entfernt (bereinigt ). Wir initialisieren diese Traps, nachdem wir überprüft haben, ob esmkdir -d
gelungen ist, ein versehentliches Ausführen des Exit-Traps$TMPDIR
in einem unbekannten Zustand zu vermeiden .quelle
-d
sucht nach Verzeichnissen. 2.) Die Beendigung ist bereits die Standardeinstellung für diese Signale.