Mam następującą strukturę plików:
build/
client/
–> index.js
A kiedy próbuję utworzyć symboliczne łącze o nazwie „klient” w katalogu kompilacji, które odnosi się do katalogu klienta w cwd, tak jak
// Fails
$ pwd
/home/user/
$ ln -s client build/client
$ stat build/client/index.js
stat: build/client/index.js: stat: Too many levels of symbolic links
Otrzymuję błąd ELOOP wyświetlony powyżej. Kiedy zmieniam ścieżkę docelową na względną do ścieżki docelowej, wszystko jest dobrze:
// Works
$ pwd
/home/user/
$ ln -s ../client build/client
$ stat build/client/index.js
stat: <outputs file stats>
Czy jest to zamierzone zachowanie i proszę wyjaśnić, dlaczego ...
Odpowiedzi:
Dla tego, który nie działa, jeśli spojrzymy na
ls -l
wynik, otrzymujemy:Teraz, aby zrozumieć, co się tutaj dzieje. Spójrzmy na polecenie, które wywołałeś:
Według strony podręcznika istnieją dwa możliwe dopasowania dla tego formatu
Będzie pasować w pierwszej formie (od pierwszej). Teraz „nazwa docelowa” lub
client
w twoim przypadku mogą być (zgodnie z kompletnąln
instrukcją) ciągami dowolnymi. Nie muszą teraz rozwiązywać żadnych problemów, ale mogą rozwiązać coś w przyszłości. To, co tworzysz za pomocą swojego wywołania, to „wiszące dowiązanie symboliczne”, a system nie powstrzymuje cię przed ich utworzeniem.Teraz twoje drugie wywołanie
ln -s ../client build/client
to tak zwane „względne dowiązanie symboliczne” (jak zauważyłeś we własnym poście). Istnieje drugi typ i jest to „absolutne dowiązanie symboliczne”, które można wywołać przez wykonanieln -s /home/user/client build/client
.To nie jest błąd. Zgodnie z instrukcją stwierdza:
To powiedziawszy, MUSISZ użyć względnej lub bezwzględnej ścieżki do celu.
źródło
To jest rzeczywiście zamierzone zachowanie. Ze strony podręcznika
ln(1)
:Jeśli chodzi o jego powód, wyobraź sobie, że dowiązanie symboliczne było interpretowane raczej w odniesieniu do jego źródła, a nie jego przeznaczenia. Później, gdy go rozwiążesz, będziesz musiał wiedzieć, jakie było twoje CWD podczas jego tworzenia, co jest nonsensowne, a co dopiero niemożliwe.
Co więcej, w ten sposób otrzymujesz zgrabną i zwartą metodę tworzenia szkieletowej struktury katalogów, którą możesz upuścić w dowolnym miejscu drzewa katalogów bez przerywania dowiązań symbolicznych.
Aby dać przykład, co mam na myśli, powiedzmy, że pracujesz nad projektem i masz skonfigurowaną całą strukturę katalogów w ten sposób:
Załóżmy teraz, że chcesz utworzyć dowiązanie symboliczne do
widgets/
wewnątrzwizardry/
. Masz dwie opcje:lub
Jeśli następnie spróbujesz przenieść się
/home/you/project
gdziekolwiek indziej, dowiązanie symboliczne utworzone za pomocą pierwszego formularza zostanie zerwane, ponieważ szuka/home/you/project/widgets
. Druga forma utrzyma funkcjonalność dowiązania symbolicznego, ponieważ szuka../widgets
względnego miejsca, w którym się znajduje, niezależnie od tego, gdzie to miejsce może być w drzewie katalogów.źródło