sed Erstellt eine temporäre Datei, schreibt die Ausgabe in diese Datei und benennt die temporäre Datei über dem Original um.
Sie können beobachten, was passiert, indem Sie strace:
$ strace -e trace=file sed -i -e '' a
execve("/usr/bin/sed", ["sed", "-i", "-e", "", "a"], [/* 34 vars */]) = 0
<...trimmed...>
open("a", O_RDONLY) = 3
open("./sedxvhRY8", O_RDWR|O_CREAT|O_EXCL, 0600) = 4
rename("./sedxvhRY8", "a") = 0
+++ exited with 0 +++
Dies protokolliert alle Dateivorgänge sed: Es erstellt eine neue Datei (sicher mit O_CREAT|O_EXCL), schreibt die Daten in sie und verschiebt sie dann wieder über meine ursprüngliche Datei a.
sed -iAkzeptiert ein Suffix, das für eine Sicherung verwendet werden soll. In diesem Fall wird das Original zuerst aus dem Weg geräumt (anstatt es umzubenennen). Dieses Argument ist in den meisten BSDs obligatorisch sed. In diesem Fall gibt es eine kurze Zeit, in der sich überhaupt keine Datei mit dem richtigen Namen im Verzeichnis befindet.
perl In neueren Versionen wird die Eingabedatei geöffnet, dann gelöscht und eine neue Datei mit demselben Namen erstellt:
open("a", O_RDONLY) = 3
unlink("a") = 0
open("a", O_WRONLY|O_CREAT|O_EXCL, 0600) = 4
Wenn Sie unlinkeine bereits geöffnete Datei löschen ( ), behalten Sie den Zugriff darauf, solange Sie das Handle behalten, damit die Daten aus der gelöschten Datei weiter gelesen werden können. Auf diese Weise wird perldirekt in die Ausgabedatei und nicht in eine temporäre Datei geschrieben: Es wird keine zusätzliche Datei erstellt. Wenn Sie die Datei jedoch während des Vorgangs lesen, erhalten Sie im Gegensatz zum sedAnsatz von partiellen Inhalt . Es gibt auch eine kurze Zeit, in der es keine Datei mit dem richtigen Namen gibt, die sich eher am Anfang des Prozesses als am Ende befindet (wie in sed -i .bak).
Beides sedund perlwird:
- Ersetzen Sie einen symbolischen Link durch eine normale Datei.
- Brechen Sie harte Verbindungen.
- Bewahren Sie nach Möglichkeit den Gruppenbesitz auf.
- Erstellen Sie die Datei mit Ihrer Standardgruppe (oder der Gruppe des übergeordneten Verzeichnisses, wenn dieses Verzeichnis das
setgidBit enthält), wenn sie einer Gruppe gehört, in der Sie sich nicht befinden, und Sie sich nicht im Stammverzeichnis befinden.
- Behalten Sie den Dateibesitz bei, wenn Sie root sind.
- Grundlegende Berechtigungen beibehalten.
- Preserve
setuidund setgrpBits, wenn die resultierende Gruppe mit der Gruppe übereinstimmt, in der sie gestartet wurde.
- Bewahren Sie das klebrige Stück auf.
- Xattrs nicht aufbewahren.
sed werden:
- ACLs beibehalten (unter Linux; ich weiß nichts über andere) .
perl werden:
Dies gilt unter Linux mit GNU sedund Mac OS X mit (von FreeBSD abgeleitet) sed.