Символьная ссылка на каталог дает разные результаты в ls -l
зависимости от того, я ln -s dir
или ln -s dir/
. Но в чем же разница, и какую мне лучше выбрать?
Символьная ссылка на каталог дает разные результаты в ls -l
зависимости от того, я ln -s dir
или ln -s dir/
. Но в чем же разница, и какую мне лучше выбрать?
Ответы:
Там нет разницы. (Будет разница, если целью не будет существующий каталог.)
Последняя косая черта могла закончиться из-за завершения оболочки: с некоторой конфигурацией ln -s tar
TabSpacelink
завершается до ln -s target/ link
.
foo -> bar/
тогда foo/qux
эквивалентно bar//qux
. Хотя название вопроса, формально говоря, не включает foo -> bar/
, я также обсуждаю этот случай в своем ответе там.
Единственное, о чем я могу думать, это то, что он «защищает» вас от того, кто удаляет каталог и создает файл.
[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]$
Версия с косой чертой прерывается, когда цель заменяется файлом.
Интересный вопрос. Я сделал небольшой тест:
$ 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
Как видите, нет разницы в количестве системных вызовов (по крайней мере, для ls), и трассировки выглядят очень похоже. Тем не менее, это всего лишь тест дампа, и я не уверен - могут быть некоторые различия.
Ваш вопрос действительно о поведении ls
программы.
1) Если вы делаете, ls -l $dir
где $ dir на самом деле является символической ссылкой, вы получаете информацию о символической ссылке.
2) Если вы делаете, ls -lL $dir
где $ dir является символической ссылкой на каталог, вы получаете информацию о целевом каталоге.
3) Если вы сделаете ls -l $dir/.
это, вы должны будете перейти по символической ссылке и предоставить информацию о целевом каталоге.
4) В противном случае ls -l $dir/
результаты могут совпадать с № 1 или № 3 в зависимости от используемой версии ls
. Я привык к более старой версии Solaris, делающей это как # 1, и был удивлен, что Linux сделал это как # 3.
и какой я должен предпочесть почему?
Без косой черты, если вас может беспокоить, является ли заданное имя каталога действительным каталогом, а не символической ссылкой на каталог.
С косой чертой, если вас больше волнуют файлы в каталоге, а не сам каталог.