我注意到在 Ubuntu 中,以下命令转到文件系统中看似不同的位置,但这些位置具有相同的文件:
cd /
cd //
从两个位置 ls-ing 会产生相同的结果:
vm@virtual-machine://$ ls
bin dev initrd.img lib64 mnt root snap sys var
boot etc initrd.img.old lost+found opt run srv tmp vmlinuz
cdrom home lib media proc sbin swapfile usr
这些看似不同但相同的文件路径的行为是否有区别?
注意:“ cd ///
”不是有效的文件路径,但“ //usr/
”和“ //bin/
”是有效路径。
注2:因此在每个点中运行 cd .. in 都指向自己,因此// -> cd .. -> //
和/ -> cd .. -> /
答案1
根据 POSIX 规范,以以下开头的路径恰好有两个斜杠具有实现定义的语义。
路径中的多个斜杠将折叠为一个斜杠,除了对于有的情况正好两个斜线位于正是开始的路径。
因此,/foo
、 、///foo
、////foo
和///////////////////foo
保证是相同的路径,/foo/bar
、/foo//bar
、/foo///bar
、 等保证是相同的路径,但是/foo
和//foo
是不是保证是相同的路径,并且 和 都不是//foo
-///foo
任何实现都可以按照自己的意愿定义语义。他们可以选择定义与和//foo
含义相同,但它们并不相同/foo
///foo
必须。
目的是操作系统可以使用以 开头的路径来//
实现与 POSIX 文件系统语义不同的语义。
例如,Windows 和 Unix 的假设混合体可以用于//
Windows 文件系统语义。 Cygwin 实际上//
用于网络路径,类似于 Windows 使用\\
.
例如,在 Cygwin 中,cd //; ls
将列出本地网络上的所有 SMB 文件服务器,而不是根目录!