为什么可以创建带有或不带有尾部斜杠的目录软链接?

为什么可以创建带有或不带有尾部斜杠的目录软链接?

我发现,在创建指向文件夹的符号链接时,会根据您的输入生成带或不带尾部斜杠的符号链接。例如:

$ ln -sfv /ln-test/FOLDER/ test-tail
test-tail -> /ln-test/FOLDER/

$ ln -sfv /ln-test/FOLDER test-notail
test-notail -> /ln-test/FOLDER

$ ll /ln-test
total 16
drwxr-xr-x  2 user  wheel    68B  2 Aug 08:35 FOLDER
lrwxr-xr-x  1 user  wheel    15B  2 Aug 08:36 test-notail -> /ln-test/FOLDER
lrwxr-xr-x  1 user  wheel    16B  2 Aug 08:36 test-tail -> /ln-test/FOLDER/

在上面在我的 Mac 和 Debian 机器上测试的示例中,生成的链接与输入的尾部斜杠相匹配。

据我了解,这可能不重要,但是最近我们在 Objective-c 中遇到了一个错误,这是由于尾随斜杠造成的。我们仍然需要追踪这个错误,但重新创建不带尾部斜杠的链接可以解决问题。

所以我真正的问题是;目录链接是否有尾部斜杠有什么关系吗?

答案1

通过符号链接访问文件相当于,如果符号链接文本不以 (相对链接) 开头,则等效于用符号链接文本替换文件的基本名称;如果符号链接以(/开头,则等效于用符号链接文本替换文件的完整路径)/绝对链接)。如果符号链接文本中有尾部斜杠,那就这样吧。

文件名中的尾部斜杠表示“该文件必须是目录”。如果链接的目标是目录,则访问其中的文件会产生包含两个斜杠的计算路径:一个来自符号链接文本,另一个作为目录分隔符。给定

lrwxr-xr-x  1 user  wheel    15B  2 Aug 08:36 test-notail -> /ln-test/FOLDER
lrwxr-xr-x  1 user  wheel    16B  2 Aug 08:36 test-tail -> /ln-test/FOLDER/

那么test-notail/foo等价于/ln-test/FOLDER/footest-tail/foo等价于/ln-test/FOLDER//foo

多条斜线与一条斜线一样好(有一个例外:在某些系统上,路径恰好以两个斜杠开头)。因此,目录符号链接中的尾部斜杠(或多个尾部斜杠)不会对系统产生影响。

如果额外的斜杠对应用程序产生影响,那就是应用程序中的错误。

答案2

对于应用程序来说,不,这应该不重要。没有尾部斜杠的链接(比您通常认为的级别要低)是指向文件称为FOLDER,一个恰好是目录的文件。带有尾部斜杠的链接明确指向目录FOLDER.作为一个反例:

$ mkdir test
$ cd test
$ touch foo
$ ll
drwxrwxr-x.   2 jwbernin jwbernin  4096 Aug  2 09:33 .
drwx------. 102 jwbernin jwbernin 20480 Aug  2 09:33 ..
-rw-rw-r--.   1 jwbernin jwbernin     0 Aug  2 09:33 foo
$ ln -s foo/ TRAIL
$ ll
drwxrwxr-x.   2 jwbernin jwbernin  4096 Aug  2 09:33 .
drwx------. 102 jwbernin jwbernin 20480 Aug  2 09:33 ..
-rw-rw-r--.   1 jwbernin jwbernin     0 Aug  2 09:33 foo
lrwxrwxrwx.   1 jwbernin jwbernin     4 Aug  2 09:33 TRAIL -> foo/

颜色突出显示未显示,但最后一个链接已损坏。如果您这样做ln -s foo NOTRAIL,则该NOTRAIL条目是该文件的有效链接foo。因为foo不是目录,所以使用尾部斜杠的链接最终会损坏。

所有目录都是文件(对于操作系统),但并非所有文件都是目录。

相关内容