So aktualisieren Sie ein symbolisches Linkziel (ln -f -s funktioniert nicht)

So aktualisieren Sie ein symbolisches Linkziel (ln -f -s funktioniert nicht)

Ich benutze

ln -f -s /var/www/html/releases/build1390 app-aktuell

um den symbolischen Link „app-current“ mit einem neuen Ziel zu aktualisieren. Dies funktioniert jedoch nicht, der Link „app-current“ behält sein ursprüngliches Ziel, ich erhalte jedoch keine Fehler ...

Ich möchte den Link lieber nicht entfernen und neu erstellen, sondern nur das Ziel eines vorhandenen Links aktualisieren. Ist das möglich?

Antwort1

Das funktioniert für mich. Was ist die Ausgabe von strace ln -f -s /var/www/html/releases/build1390 app-current?

Oh, da es sich um ein Verzeichnis handelt, das Sie hinzufügen müssen, -num keine Dereferenzierung zu erhalten, sollte dies das Problem lösen. -fist eigentlich eher praktisch, da das Hinzufügen von -f ohnehin dazu führt, dass die Verknüpfung aufgehoben wird. Obwohl ich vermute, dass es auf einem normal ausgelasteten System wahrscheinlich ein paar hundert ms schneller passieren würde.

Wenn arf beispielsweise bereits auf /home zeigt:

strace Mit -n:

strace ln -n -f -s / arf
...
symlink("/", "arf")           = -1 EEXIST (File exists)
unlink("arf")                           = 0
symlink("/", "arf")           = 0

strace Ohne -n:

strace ln -f -s / arf
...
write(2, "ln: "..., 4ln: )                  = 4
write(2, "`arf/': cannot overwrite director"..., 34`arf/': cannot overwrite directory) = 34
write(2, "\n"..., 1)                    = 1

Ohne -nwird also arf dereferenziert, sodass ln es als arf behandelt, als wäre es tatsächlich /. Wenn in Ihrem speziellen Beispiel kein Fehler vorliegt, haben Sie wahrscheinlich einen neuen symbolischen Link darin erstellt /var/www/html/releases/build1390 app-currentund möchten diesen bereinigen.

Antwort2

Sie können -noder verwenden --no-dereference, um zu verhindern, dass das Ziel dereferenziert wird, wenn es sich um einen symbolischen Link handelt. Sie können auch -Toder verwenden --no-target-directory, um sicherzustellen, dass die Zieldateistetswie eine normale Datei behandelt werden.

Diese erzeugen ein leicht unterschiedliches Verhalten, wie das folgende Beispiel zeigt. Angenommen, es handelt srcsich um eine Datei, dirlinkeinen symbolischen Link zu einem Verzeichnis und direin tatsächliches Verzeichnis.

Verwendung von -n:

  • ln -sfn src dirlinküberschreibt dirlinkund verknüpft es mitsrc
  • ln -sfn src dirLink erstellendir/src -> src

Verwendung von -T:

  • ln -sfT src dirlinküberschreibt dirlinkund verknüpft es mitsrc
  • ln -sfT src direrzeugt eine Fehlermeldung:ln: ‘dir’: cannot overwrite directory

verwandte Informationen