Symlinkowanie do katalogu daje różne wyniki w ls -l
zależności od tego, czy ja, ln -s dir
czy ln -s dir/
. Ale jaka jest faktyczna różnica, a którą wolę, dlaczego?
Symlinkowanie do katalogu daje różne wyniki w ls -l
zależności od tego, czy ja, ln -s dir
czy ln -s dir/
. Ale jaka jest faktyczna różnica, a którą wolę, dlaczego?
Odpowiedzi:
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 tar
TabSpacelink
kończy się na ln -s target/ link
.
foo -> bar/
to foo/qux
jest równoważne bar//qux
. Chociaż tytuł pytania, formalnie rzecz biorąc, nie obejmuje foo -> bar/
, omawiam również tę sprawę w mojej odpowiedzi.
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.
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.
Twoje pytanie naprawdę dotyczy zachowania ls
programu.
1) Jeśli zrobisz, ls -l $dir
gdzie $ dir jest faktycznie dowiązaniem symbolicznym, otrzymasz informację o dowiązaniu symbolicznym.
2) Jeśli zrobisz, ls -lL $dir
gdzie $ 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.