Moje podstawowe rozumienie dowiązania symbolicznego to specjalny plik, plik zawierający ścieżkę łańcucha do innego pliku. VFS jądra pobiera wiele z tego, ale czy istnieje jakiś powód, dla którego dowiązania symboliczne wydają się niemożliwe do edycji?
Innymi słowy: czy mogę edytować dowiązanie symboliczne? Jeśli nie, dlaczego nie?
Rozumiem, że istnieją różne sposoby zastępowania dowiązań symbolicznych (dwie alternatywy znajdują się obecnie w sekcji odpowiedzi), ale interesujące byłoby wyjaśnienie, dlaczego wymiana wydaje się jedynym sposobem radzenia sobie z dowiązaniami symbolicznymi. Dlaczego nie możesz po prostu zmienić miejsca, w którym wskazują?
filesystems
symlink
Oli
źródło
źródło
Odpowiedzi:
Ponieważ
-f
po prostu wykonuje cichą zamianę, możesz wykonać zamianę atomową za pomocąmv -T
(-T sprawia, że działa, nawet jeśli /loc.../link jest katalogiem) :linkname
jest dostępny przez cały proces.źródło
linkname
się, że nie jest to dowiązanie symboliczne do katalogu. Użyj-T
opcji, abymv
na GNU lub-h
na FreeBSD, aby tego uniknąć. Pamiętaj, że wln -sf
ten sposób nie zachowuje uprawnień do łącza (w systemach, w których są one znaczące).-n
opcji npln -sfn DESTINATION_DIRECTORY LINK_NAME
. : Czytaj więcej na askubuntu.com/a/186227/69004Jeśli przez edycję chcesz zmienić plik, na który wskazuje, to tak, możesz:
-f
Parametr (--force
), gdy przeszedł do ln powoduje go wezwaćunlink()
tuż przed wywołanie systemowesymlink()
Zaczerpnięte z poniższej odpowiedzi przepełnienia stosu .
źródło
test
, że celem nie jest katalog. W przeciwnym razieln -s -f .profile test
utworzyłby.profile
dowiązanie symboliczne w tym katalogu. GNUln
ma-T
opcję, aby tego uniknąć.Łącza symboliczne należy zmodyfikować atomowo. Jeśli jesteś w połowie pisania, nie będą działać. Treść dowiązania symbolicznego jest dość mała (maksymalnie 4095 znaków w Linuksie: maksymalna długość ścieżki do pliku), więc nie ma sensu edytować części dowiązania symbolicznego na poziomie jądra. Dlatego jądro nie oferuje żadnego interfejsu do edycji dowiązania symbolicznego, tylko interfejs do tworzenia nowego,
symlink
wywołania systemowego (plus ogólny interfejsunlink
do usuwania dowolnego pliku).symlink
Wywołanie systemowe tylko tworzy nowy link symboliczny, nie usunąć istniejący plik. Jest to denerwujące, ale spójne z innymi wywołaniami systemowymi do tworzenia plików, takich jakopen
(które mogą utworzyć nowy plik lub skrócić istniejący plik, ale nie zastąpić istniejącego pliku nowo utworzonym plikiem) imkdir
.Jak już odkryłeś , w powłoce nie możesz atomowo zastąpić dowiązania symbolicznego
ln
poleceniem (ln -sf
rozłącza poprzedni plik, a następnie tworzy dowiązanie symboliczne), możesz to zrobić, najpierw tworząc dowiązanie symboliczne pod nazwą tymczasową i następnie przesuwając go na miejsce.źródło
mv -f
(jakln -sf
) nie zrobi tego, co chcesz, jeśli$link
wskazuje na katalog. GNU ln i mv mają coś-T
takiego.mv
(zmiana nazwy wywołania systemowego) zawsze zmieni i-węzeł$link
whileln -sfT
(unlink + symlink) może ponownie tego samego użyć.Technicznie nie ma wbudowanego polecenia do edycji istniejącego dowiązania symbolicznego. Można to łatwo osiągnąć za pomocą kilku krótkich poleceń.
Oto mała funkcja bash / zsh, którą napisałem, aby zaktualizować istniejące łącze symboliczne:
źródło
Załóżmy, że linkname istnieje w wyniku wykonania (w przeszłości):
Istnieją trzy sposoby zmiany dowiązania symbolicznego:
Użyj ln z
-f
siłą, a nawet dla katalogów-n
(i-węzeł może zostać ponownie użyty):Usuń dowiązanie symboliczne i utwórz nowe (nawet dla katalogów):
utwórz nowe dowiązanie symboliczne, a następnie
mv
(zmiana atomowa nawet dla katalogów):źródło