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 可能与它没有任何关系。)
根据POSIX 定义,以双斜杠 (//) 开头的路径“...可以以实现定义的方式解释,但应将两个以上的前导斜杠视为单个斜杠。” 例如,如果您使用 csh,它的行为方式就不一样:
% bash -c 'cd //; pwd'
//
% csh -c 'cd //; pwd'
/
Run Code Online (Sandbox Code Playgroud)
Bash 似乎正在存储目录,而 pwd 正在报告 $PWD,而 csh 似乎正在使用该getcwd()
函数来获取实际目录。
归档时间: |
|
查看次数: |
19050 次 |
最近记录: |