![为什么可以创建带有或不带有尾部斜杠的目录软链接?](https://linux22.com/image/10601/%E4%B8%BA%E4%BB%80%E4%B9%88%E5%8F%AF%E4%BB%A5%E5%88%9B%E5%BB%BA%E5%B8%A6%E6%9C%89%E6%88%96%E4%B8%8D%E5%B8%A6%E6%9C%89%E5%B0%BE%E9%83%A8%E6%96%9C%E6%9D%A0%E7%9A%84%E7%9B%AE%E5%BD%95%E8%BD%AF%E9%93%BE%E6%8E%A5%EF%BC%9F.png)
我发现,在创建指向文件夹的符号链接时,会根据您的输入生成带或不带尾部斜杠的符号链接。例如:
$ 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/foo
且test-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
不是目录,所以使用尾部斜杠的链接最终会损坏。
所有目录都是文件(对于操作系统),但并非所有文件都是目录。