Czy powinienem dołączyć ukośnik / do dowiązania symbolicznego do katalogu?

30

Symlinkowanie do katalogu daje różne wyniki w ls -lzależności od tego, czy ja, ln -s dirczy ln -s dir/. Ale jaka jest faktyczna różnica, a którą wolę, dlaczego?

Tobias Kienzler
źródło

Odpowiedzi:

9

Nie ma różnicy. (Byłaby różnica, gdyby celem nie był istniejący katalog.)

Ostatni ukośnik mógł się tam skończyć z powodu ukończenia powłoki: z pewną konfiguracją ln -s tarTabSpacelinkkończy się na ln -s target/ link.

Gilles „SO- przestań być zły”
źródło
Wydaje się, że połączone pytanie dotyczy wielu kolejnych ukośników na ścieżkach, ale nie dotyczy końcowych ukośników na linkach. Nie jestem pewien, czy ma tu coś do powiedzenia.
mwfearnley
Właściwie nie powinienem był tego mówić. Ma wiele do powiedzenia na temat wspólnego problemu, który jest ściśle związany z pytaniem. Nie sądzę jednak, by prowadziło to do tego wniosku.
mwfearnley
@mwfearnley To logiczna konsekwencja: jeśli foo -> bar/to foo/quxjest równoważne bar//qux. Chociaż tytuł pytania, formalnie rzecz biorąc, nie obejmuje foo -> bar/, omawiam również tę sprawę w mojej odpowiedzi.
Gilles „SO- przestań być zły”
Cześć, dzięki za odpowiedź .. Mówi mi, że ścieżki zawierające dowiązania symboliczne są równoważne. Niekoniecznie mówi mi, co się stanie, jeśli uzyskam dostęp do samego dowiązania symbolicznego (bez końcowego ukośnika) i bez bycia ekspertem od Uniksa niekoniecznie wiem, co znaczy „równoważność” lub co nie znaczy.
mwfearnley
Jest co najmniej jeden przypadek, w którym robi to różnicę, więc musiałem zanegować tę odpowiedź.
Flimm
27

Jedyne, o czym mogę myśleć, to to, że „chroni” cię przed usunięciem katalogu i utworzeniem pliku.

[user@host linktest]$ mkdir test
[user@host linktest]$ ln -s test/ slash
[user@host linktest]$ ln -s test noslash
[user@host linktest]$ ls -l
total 4
lrwxrwxrwx 1 paul paul    4 Feb 21 21:00 noslash -> test
lrwxrwxrwx 1 paul paul    5 Feb 21 21:00 slash -> test/
drwxrwxr-x 2 paul paul 4096 Feb 21 20:59 test
[user@host linktest]$ file *slash
noslash: symbolic link to `test'
slash: symbolic link to `test/'
[user@host linktest]$ rmdir test
[user@host linktest]$ file *slash
noslash: broken symbolic link to `test'
slash: broken symbolic link to `test/'
[user@host linktest]$ touch test
[user@host linktest]$ file *slash
noslash: symbolic link to `test'
slash: broken symbolic link to `test/'
[user@host linktest]$

Wersja z ukośnikiem psuje się, gdy cel zostaje zastąpiony plikiem.

rozwój
źródło
3

Interesujące pytanie. Zrobiłem mały test:

$ mkdir dir
$ ln -s dir/ test_slash
$ ln -s dir test_noslash
$ ls -l
total 4
drwxr-xr-x 2 vrusinov vrusinov 4096 Feb 21 16:41 dir
lrwxrwxrwx 1 vrusinov vrusinov    3 Feb 21 16:41 test_noslash -> dir
lrwxrwxrwx 1 vrusinov vrusinov    4 Feb 21 16:41 test_slash -> dir/
$ strace ls test_slash 2> trace_slash
$ strace ls test_noslash 2> trace_noslash
$ wc -l trace_*
   79 trace_noslash
   79 trace_slash
$ diff -u trace_* | less

Jak widać, nie ma różnicy w liczbie wywołań systemowych (przynajmniej dla ls), a ślady wyglądają bardzo podobnie. Jednak jest to tylko test zrzutu i nie jestem pewien - mogą występować pewne różnice.

RVS
źródło
Zastanawiam się także, czy to rzeczywiście robi różnicę, ale dlaczego miałby być przechowywany ten dodatkowy slash?
Tobias Kienzler
2

Twoje pytanie naprawdę dotyczy zachowania lsprogramu.

1) Jeśli zrobisz, ls -l $dirgdzie $ dir jest faktycznie dowiązaniem symbolicznym, otrzymasz informację o dowiązaniu symbolicznym.

2) Jeśli zrobisz, ls -lL $dirgdzie $ dir jest dowiązaniem symbolicznym do katalogu, otrzymasz informacje o katalogu docelowym.

3) Jeśli to zrobisz ls -l $dir/., wymusza podążanie za dowiązaniem symbolicznym i dostarcza informacji o katalogu docelowym.

4) Jeśli to zrobisz ls -l $dir/, wyniki mogą być takie same jak nr 1 lub mogą być takie same jak nr 3, w zależności od używanej wersji ls. Przyzwyczaiłem się do starszej wersji Solaris robiąc to jak nr 1 i byłem zaskoczony, że Linux zrobił to jak nr 3.

a który powinienem preferować dlaczego?

Bez końcowego ukośnika, jeśli możesz się martwić, czy podana nazwa katalogu jest rzeczywistym katalogiem czy dowiązaniem symbolicznym do katalogu.

Z końcowym ukośnikiem, jeśli bardziej martwisz się plikami w katalogu zamiast samego katalogu.

Joe Inwap
źródło