Beim Ausführen eines Skripts möchte ich eine temporäre Datei im /tmp
Verzeichnis erstellen .
Nach der Ausführung dieses Skripts wird dieses Skript bereinigt.
Wie mache ich das in Shell-Skript?
shell-script
tmp
Bhuvanesh
quelle
quelle
/proc
- außer für Systeme, die es nicht haben.exec 3> "$tmpfile"
tun? Ist das nicht nur dann sinnvoll, wenn es sich bei der tmpfile um ein eigenständiges Skript handelt?cat <&3
wird gebenBad file descriptor
. Ich würde es begrüßen, wenn Sie es entweder reparieren oder entfernen; Fehlinformationen helfen nicht viel.Verwenden Sie
mktemp
diese Option , um eine temporäre Datei oder ein temporäres Verzeichnis zu erstellen:Oder für ein Direcotry:
Am Ende des Skripts müssen Sie die temporäre Datei / dir löschen:
mktemp erstellt eine Datei im
/tmp
Verzeichnis oder in der mit dem--tmpdir
Argument angegebenen Verzeichnisstruktur .quelle
trap "rm -f $temp_file" 0 2 3 15
direkt nach dem Erstellen der Datei verwenden, so dass beim Beenden des Skripts oder beim Stoppenctrl-C
die Datei weiterhin entfernt wird.EXIT
der einzige Haken dafür isttrap
?kill -9 $somepid
. Dieses besondere Kill-Signal ist Insta-Death, und nichts anderes passiert.bash -c 'echo $$; trap "echo foo" 0; sleep 5'
EXIT
ist genug.Wenn Sie sich auf einem System mit mktemp befinden , sollten Sie es als andere Antwort verwenden.
Mit POSIX-Werkzeugkasten:
quelle
EXIT
der einzige Haken für isttrap
?tmpfile
vor dem Beenden des Skripts noch entfernt, aber nicht, wenn das Skript andere Signale empfangen hat.That's not what happens
?mktemp
entstanden in HP / UX mit einer anderen Syntax. Todd C. Miller hat Mitte der 90er Jahre eine andere Version für OpenBSD entwickelt (kopiert von FreeBSD und NetBSD) und später auch als eigenständiges Hilfsprogramm zur Verfügung gestellt (www.mktemp.org). Dies war diejenige, die normalerweise unter Linux verwendet wurde, bis 2007 ein (größtenteils kompatibles)mktemp
Dienstprogramm zu den GNU-Coreutils hinzugefügt wurdemktemp
.Einige Shells haben die Funktion eingebaut.
zsh
zsh
Die=(...)
Form der Prozessersetzung verwendet eine temporäre Datei. Erweitert beispielsweise=(echo test)
den Pfad einer temporären Datei, die enthälttest\n
.Diese Datei wird nach Beendigung des Befehls automatisch entfernt.
bash / zsh unter Linux.
Here-Dateien oder Here-Strings in
bash
undzsh
werden als gelöschte temporäre Dateien implementiert.Also wenn du tust:
Der Dateideskriptor 3 ist mit einer gelöschten temporären Datei verbunden, die enthält
test\n
.Sie können den Inhalt erhalten mit:
Unter Linux können Sie diese Datei auch über lesen oder schreiben
/dev/fd/3
(Einige andere Shells verwenden Pipes oder können verwendet werden,
/dev/null
wenn das Dokument hier leer ist.)POSIX
Es gibt kein
mktemp
POSIX-Dienstprogramm. POSIX gibt jedoch einemkstemp(template)
C-API an , und dasm4
Standarddienstprogramm macht diese API mit der gleichnamigenmkstemp()
m4-Funktion verfügbar.mkstemp()
gibt Ihnen einen Dateinamen mit einem zufälligen Teil, der zum Zeitpunkt des Funktionsaufrufs garantiert nicht vorhanden war. Es erstellt die Datei mit den Berechtigungen 0600 auf rennfreie Weise.Sie könnten also Folgendes tun:
Beachten Sie jedoch, dass Sie die Bereinigung beim Beenden durchführen müssen. Wenn Sie die Datei jedoch nur eine feste Anzahl von Malen schreiben und lesen müssen, können Sie sie direkt nach dem Erstellen öffnen und löschen, z. B. für here-doc / here-. String-Ansatz oben:
Sie können die Datei zum Lesen einmal öffnen und zwischen zwei Lesevorgängen zurückspulen. Es gibt jedoch kein POSIX-Dienstprogramm, das das Zurückspulen durchführen kann (
lseek()
). Sie können es also nicht portabel in einem POSIX-Skript (zsh
(sysseek
eingebaut) undksh93
(<#((...))
Operator) ausführen mach es aber).quelle
<()
=(...)
.Hier ist eine etwas verbesserte Antwort in der Zeile von Hauke Laging:
quelle
Mein Workflow mit temporären Dateien basiert normalerweise auf einem Bash-Skript, das ich teste. Ich möchte
tee
es öffnen, damit ich sehen kann, dass es funktioniert, und die Ausgabe für die nächste Iteration meines Prozesses speichern. Ich habe eine Datei namens erstellttmp
damit ich es gerne nutzen kann
Der Grund, warum ich die vor den Zufallswerten formatierte Datumszeit mag, ist, dass ich die soeben erstellte tmp-Datei leicht finden kann und nicht darüber nachdenken muss, wie ich sie das nächste Mal benennen soll (und mich darauf konzentrieren muss, nur mein Dang-Skript abzurufen arbeiten).
quelle