桩路径“/”和“//”有什么区别?

桩路径“/”和“//”有什么区别?

我注意到在 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 文件服务器,而不是根目录!

相关内容