Ich verstehe einen Symlink grundsätzlich als eine spezielle Datei, eine Datei, die einen Zeichenkettenpfad zu einer anderen Datei enthält. Das VFS des Kernels abstrahiert einen Großteil davon, aber gibt es einen Grund, warum Symlinks scheinbar nicht bearbeitet werden können?
Mit anderen Worten: Kann ich einen Symlink bearbeiten? Wenn nein, warum nicht?
Ich verstehe, dass es verschiedene Möglichkeiten gibt , Symlinks zu ersetzen (zwei Alternativen finden Sie derzeit im Abschnitt Antworten), aber es wäre interessant, eine Erklärung zu erhalten, warum das Ersetzen die einzige Möglichkeit zu sein scheint, mit Symlinks umzugehen. Warum kannst du nicht einfach ändern, wohin sie zeigen?
filesystems
symlink
Oli
quelle
quelle
Antworten:
Da dies
-f
nur eine stille Ersetzung ist, können Sie eine atomare Ersetzung mitmv -T
(-T bewirkt, dass es funktioniert, auch wenn /loc.../link ein Verzeichnis ist) :linkname
ist während des gesamten Prozesses zugänglich.quelle
linkname
es sich nicht um einen Symlink zu einem Verzeichnis handelt. Verwenden Sie die-T
Option,mv
um dies unter GNU oder-h
unter FreeBSD zu vermeiden. Beachten Sie,ln -sf
dass auf diese Weise die Berechtigungen des Links nicht erhalten bleiben (auf Systemen, auf denen sie von Bedeutung sind).-n
Optionen zu verwenden , zln -sfn DESTINATION_DIRECTORY LINK_NAME
. Lesen Sie mehr auf askubuntu.com/a/186227/69004Wenn Sie durch Bearbeiten die Datei ändern möchten, auf die sie verweist, können Sie:
Der
-f
Parameter (--force
) , wenn übergeben ln es bewirkt , dass es das nennenunlink()
Systemaufruf direkt vorsymlink()
Entnommen aus der folgenden Stapelüberlaufantwort .
quelle
test
, dass das Ziel kein Verzeichnis ist. Andernfallsln -s -f .profile test
würde ein.profile
Symlink in diesem Verzeichnis erstellt. GNUln
hat eine-T
Option, dies zu vermeiden.Symbolische Links müssen atomar modifiziert werden. Wenn Sie auf halbem Weg sind, werden sie nicht funktionieren. Der Inhalt eines symbolischen Links ist ziemlich klein (höchstens 4095 Zeichen unter Linux: die maximale Länge eines Pfads zu einer Datei), sodass es wenig Sinn macht, einen Teil eines symbolischen Links auf Kernelebene zu bearbeiten. Daher bietet der Kernel keine Schnittstelle zum Bearbeiten eines symbolischen Links, nur eine Schnittstelle zum Erstellen eines neuen Links, den
symlink
Systemaufruf (plus die allgemeine Schnittstelleunlink
zum Entfernen von Dateien).Der
symlink
Systemaufruf erstellt nur eine neue symbolische Verknüpfung, entfernt jedoch keine vorhandene Datei. Dies ist ärgerlich, aber im Einklang mit anderen Systemaufrufen zum Erstellen von Dateien wieopen
(die eine neue Datei erstellen oder eine vorhandene Datei abschneiden, eine vorhandene Datei jedoch nicht durch eine neu erstellte Datei ersetzen können) undmkdir
.In der Shell können Sie , wie Sie festgestellt haben , einen symbolischen Link nicht atomar durch den
ln
Befehl ersetzen (ln -sf
indem Sie die Verknüpfung der vorherigen Datei aufheben und dann den symbolischen Link erstellen). Dazu müssen Sie zunächst einen symbolischen Link unter einem temporären Namen und erstellen dann verschieben Sie es in Position.quelle
mv -f
(wieln -sf
) wird nicht tun, was Sie wollen, wenn$link
auf ein Verzeichnis verweist. GNU ln und mv haben ein-T
dafür.mv
(Systemaufruf umbenennen) ändert immer den Inode von$link
whileln -sfT
(Unlink + Symlink).Technisch gibt es keinen eingebauten Befehl zum Bearbeiten einer vorhandenen symbolischen Verknüpfung. Es kann leicht mit ein paar kurzen Befehlen erreicht werden.
Hier ist eine kleine Bash / Zsh-Funktion, die ich geschrieben habe, um einen vorhandenen symbolischen Link zu aktualisieren:
quelle
Angenommen, der Linkname existiert als Ergebnis dessen, was (in der Vergangenheit) getan wurde:
Dann gibt es drei Möglichkeiten, den Symlink zu ändern:
Verwenden Sie ln mit
-f
Kraft und sogar für Verzeichnisse-n
(Inode könnte wiederverwendet werden):Entfernen Sie den Symlink und erstellen Sie einen neuen (auch für Verzeichnisse):
erstelle einen neuen symlink, dann geht
mv
es (atomarer wechsel auch für verzeichnisse):quelle