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

Shu*_*hum 57 linux bash slash filenames

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

$ cd /home/shum
$ pwd
/home/shum
$ cd /home//shum
$ pwd
/home/shum
$ cd /home///shum
$ pwd
/home/shum
Run Code Online (Sandbox Code Playgroud)

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

$ cd ////home
$ pwd
/home
$ cd ///
$ pwd
/
$ cd //
$ pwd
//
$ cd home//shum
$ pwd
//home/shum
Run Code Online (Sandbox Code Playgroud)

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

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

Gil*_*il' 57

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

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

事实上,您所看到的并不是 Linux 做任何特别的事情//:它是 bash 的当前目录跟踪。相比:

$ bash -c 'cd //; pwd'
//
$ bash -c 'cd //; /bin/pwd'
/
Run Code Online (Sandbox Code Playgroud)

Bash 正在采取操作系统可能会//特别对待并保留它的预防措施。Dash 也是如此。Ksh 和 zsh 在 Linux 上运行时没有,我猜(我没有检查过)它们有一个编译时设置。


sar*_*old 21

来自POSIX 规范

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

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

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

  • 我记得在早期的系统 V 实现(Utek V 和 DFS)中允许远程文件系统访问的双斜杠。语法为 //servername/path。就像 Solaris 自动挂载程序现在将使用 /net/servername/path 一样。 (3认同)
  • [Linux 对 `//` 没有任何作用,它是 bash。](http://unix.stackexchange.com/questions/12283/unix-difference-between-path-starting-with-and/12291#12291) (3认同)

jsb*_*ngs 9

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

% bash -c 'cd //; pwd'
//
% csh -c 'cd //; pwd'
/
Run Code Online (Sandbox Code Playgroud)

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