符号链接到目录会ls -l
根据I ln -s dir
或I 给出不同的结果ln -s dir/
。但是实际的区别是什么?为什么我更喜欢哪一个呢?
符号链接到目录会ls -l
根据I ln -s dir
或I 给出不同的结果ln -s dir/
。但是实际的区别是什么?为什么我更喜欢哪一个呢?
Answers:
没有区别 (如果目标不是现有目录,则会有所不同。)
最终的斜线可能会因为shell的完成而结束:使用某些配置,ln -s tar
TabSpacelink
完成到ln -s target/ link
。
foo -> bar/
then 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而言),并且跟踪看起来非常相似。Howewer,这只是转储测试,我不确定-可能会有一些差异。
您的问题确实与ls
程序的行为有关。
1)如果您ls -l $dir
在$ dir实际上是符号链接的地方进行操作,则会获得有关符号链接的信息。
2)如果ls -lL $dir
$ dir是指向目录的符号链接,则将获得有关目标目录的信息。
3)如果这样做,ls -l $dir/.
将强制遵循符号链接并提供有关目标目录的信息。
4)如果这样做ls -l $dir/
,则结果可能与#1相同或与#3相同,这取决于ls
所使用的版本。我曾经习惯过像#1这样的旧版Solaris,而对Linux像#3这样的做法感到惊讶。
我应该选择哪一个呢?
如果您担心给定目录名是实际目录,而不是符号指向目录的链接,请使用斜杠。
如果您更关心目录中的文件而不是目录本身,请使用斜杠。