AFAIK, nie, nie możesz. Musisz go usunąć i odtworzyć. Właściwie możesz nadpisać łącze symboliczne i zaktualizować w ten sposób ścieżkę, do której się ono odwołuje:
$ ln -s .bashrc test
$ ls -al test
lrwxrwxrwx 1 pascal pascal 7 2009-09-23 17:12 test -> .bashrc
$ ln -s .profile test
ln: creating symbolic link `test': File exists
$ ln -s -f .profile test
$ ls -al test
lrwxrwxrwx 1 pascal pascal 8 2009-09-23 17:12 test -> .profile
EDYCJA : Jak OP wskazał w komentarzu, użycie --force
opcji spowoduje ln
wykonanie wywołania systemowego unlink()
wcześniej symlink()
. Poniżej wyjście z strace
mojego Linux-a, które to potwierdza:
$ strace -o /tmp/output.txt ln -s -f .bash_aliases test
$ grep -C3 ^unlink /tmp/output.txt
lstat64("test", {st_mode=S_IFLNK|0777, st_size=7, ...}) = 0
stat64(".bash_aliases", {st_mode=S_IFREG|0644, st_size=2043, ...}) = 0
symlink(".bash_aliases", "test") = -1 EEXIST (File exists)
unlink("test") = 0
symlink(".bash_aliases", "test") = 0
close(0) = 0
close(1) = 0
Więc myślę, że ostateczna odpowiedź brzmi „nie”.
EDYCJA : Poniższy tekst jest skopiowany z odpowiedzi Arto Bendikena na unix.stackexchange.com, około 2016 r.
To może być rzeczywiście wykonywane atomowo z rename(2)
, najpierw tworzenia nowego dowiązania pod tymczasową nazwą, a następnie czysto nadpisanie starego dowiązania w jednym zamachem. Jak stwierdza strona podręcznika :
Jeśli newpath odnosi się do dowiązania symbolicznego, to łącze zostanie nadpisane.
W powłoce zrobiłbyś to mv -T
w następujący sposób:
$ mkdir a b
$ ln -s a z
$ ln -s b z.new
$ mv -T z.new z
Możesz strace
to ostatnie polecenie, aby upewnić się, że rzeczywiście używa rename(2)
pod maską:
$ strace mv -T z.new z
lstat64("z.new", {st_mode=S_IFLNK|0777, st_size=1, ...}) = 0
lstat64("z", {st_mode=S_IFLNK|0777, st_size=1, ...}) = 0
rename("z.new", "z") = 0
Zauważ, że w powyższym, oba mv -T
i strace
są specyficzne dla Linuksa.
We FreeBSD używaj mv -h
naprzemiennie.
Uwaga redaktora: Tak robi Capistrano od lat, od czasu ~ 2.15. Zobacz to żądanie ściągnięcia .
ln
polecenia (lub równoważnika API) nadpisującego stare łącze? Jaki masz problem?