我在 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 在 each 指向自己,所以// -> cd .. -> //
和/ -> cd .. -> /
根据 POSIX 规范,恰好以两个斜杠开头的路径具有实现定义的语义。
路径中的多个斜线折叠为一个斜线,但路径的开头正好有两个斜线的情况除外。
所以,
/foo
,///foo
,////foo
, and///////////////////foo
保证是相同的路径,,/foo/bar
,/foo//bar
,/foo///bar
等等保证是相同的路径,但/foo
and//foo
不保证//foo
是相同的路径, and也不是///foo
——任何实现都可以定义语义如他们所愿。他们可以选择定义为与 and//foo
表示相同的含义,但他们不必这样做。/foo
///foo
目的是操作系统可以使用以开头的路径
//
来实现不同于 POSIX 文件系统语义的语义。例如,Windows 和 Unix 的假设混合体可以
//
用于 Windows 文件系统语义。Cygwin 实际上//
用于网络路径,类似于 Windows 使用\\
.例如,在 Cygwin 中,
cd //; ls
将列出本地网络上的所有 SMB 文件服务器,而不是根目录!