符号链接到目录会产生不同的结果,具体ls -l
取决于 Iln -s dir
或ln -s dir/
.但实际的区别是什么?为什么我应该更喜欢哪一个呢?
答案1
我唯一能想到的是,添加斜杠可以“保护”您免受某人删除实际目录并将其替换为文件的影响,因为没有斜杠的链接仍然有效,现在指向不同的对象(而不是文件)目录)。
[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]$
当目标被文件替换时,带斜杠的版本会中断。
答案2
没有什么区别。(如果目标不是现有目录,则会有所不同。)
由于 shell 完成,最后的斜杠可能会在那里结束:通过某些配置,ln -s tar
TabSpacelink
完成为ln -s target/ link
.
答案3
您的问题实际上是关于程序的行为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 那样做,这让我感到惊讶。
我应该选择哪一个,为什么?
如果您可能担心给定的目录名称是实际目录还是目录的符号链接,则无需尾部斜杠。
如果您更关心目录中的文件而不是目录本身,请使用尾部斜杠。
答案4
有趣的问题。我做了一个小测试:
$ 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 而言),并且跟踪看起来非常相似。然而,这只是转储测试,我不确定 - 可能存在一些差异。