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 -i
Akzeptiert 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 unlink
eine 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 perl
direkt 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 sed
Ansatz 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 sed
und perl
wird:
- 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
setgid
Bit 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
setuid
und setgrp
Bits, 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 sed
und Mac OS X mit (von FreeBSD abgeleitet) sed
.