unix,以“/”和“//”开头的路径之间的区别

unix,以“/”和“//”开头的路径之间的区别

在 unix/linux 中,路径中任意数量的连续正斜杠通常相当于单个正斜杠。例如。

$ cd /home/shum
$ pwd
/home/shum
$ cd /home//shum
$ pwd
/home/shum
$ cd /home///shum
$ pwd
/home/shum

然而由于某种原因,绝对路径开头的两个正斜杠被特殊对待。例如。

$ cd ////home
$ pwd
/home
$ cd ///
$ pwd
/
$ cd //
$ pwd
//
$ cd home//shum
$ pwd
//home/shum

补丁中其他任何位置的任何其他数量的连续正斜杠都会被截断,但开头的两个正斜杠将保留,即使您随后在相对于它的文件系统中导航也是如此。

为什么是这样? /... 和 //... 之间有什么区别吗?

答案1

大多数情况下,路径中重复的斜杠相当于单个斜杠。此行为是 POSIX 强制执行的,并且大多数应用程序都会遵循。例外是“以两个连续斜杠开头的路径名可以以实现定义的方式解释”(但///foo相当于/foo)。

大多数 unice 不会对两个开头的斜杠做任何特殊的事情。尤其是 Linux,则不然。 Cygwin 的作用是://hostname/path访问网络驱动器 (SMB)。

实际上,您所看到的 Linux 并没有对 做任何特殊的事情//:它是 bash 的当前目录跟踪。比较:

$ bash -c 'cd //; pwd'
//
$ bash -c 'cd //; /bin/pwd'
/

Bash 正在采取预防措施,操作系统可能会对其进行//特殊处理并保留它。达世币也做同样的事情。 Ksh 和 zsh 在 Linux 上运行时不会,我猜(我没有检查)它们有编译时设置。

答案2

来自POSIX 规范:

以两个连续斜杠开头的路径名可以以实现定义的方式解释,尽管两个以上的前导斜杠应被视为单个斜杠。

我认为Linux bash会保留这种行为,以防将来有令人信服的用途。

(我一直听说 Al Viro 保留了它,因为 Plan9 中的一个功能使用了它,并且他希望在 Linux 中拥有该功能,但我在 Plan9 文档中找不到该功能。但是,既然它是在bash里面,阿尔可能与它没有任何关系。)

答案3

根据POSIX 定义,以双斜杠 (//) 开头的路径“...可以以实现定义的方式进行解释,尽管两个以上的前导斜杠应被视为单斜杠。”例如,如果您使用 csh,它的行为方式就不一样:

% bash -c 'cd //; pwd'
//
% csh -c 'cd //; pwd'
/

Bash 似乎正在存储目录,pwd 正在报告 $PWD,而 csh 似乎正在使用该getcwd()函数来获取实际目录。

相关内容