我应该在目录的符号链接中包含尾部斜杠 / 吗?

我应该在目录的符号链接中包含尾部斜杠 / 吗?

符号链接到目录会产生不同的结果,具体ls -l取决于 Iln -s dirln -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 tarTabSpacelink完成为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 而言),并且跟踪看起来非常相似。然而,这只是转储测试,我不确定 - 可能存在一些差异。

相关内容