一位同事刚刚指出了一些奇怪的事情,我很好奇可能的解释是什么。
在我尝试过的系统上,cd /'、'cd //' 和 'cd ///' 都具有将目录更改为文件系统根目录的效果。然而,'cd /; pwd' 和 'cd ///; pwd' 返回响应'/',但是'cd //; pwd' 返回'//',即使它是文件系统根,与其他情况一样。
是什么赋予了?
答案1
一些系统使用双斜杠来表示网络上的主机名,例如,
//host/usr/bin
POSIX 在描述中认可了这种用法cd
:
实现可以进一步简化柯帕斯通过删除任何不是前导的尾随字符
<slash>
字符,用单个字符替换多个非前导连续字符<slash>
,并替换三或多个主要角色与一个<slash>
。如果,作为这种规范化的结果,柯帕斯变量为空,无需采取进一步的步骤。
例如,Apollo 工作站就做到了这一点(参见为什么要使用 //、# 等?参见蒂姆·伯纳斯·李的常见问题解答)。
答案2
pwd
我的系统上有两个可能的来源:pwd
内置bash
的 和/usr/bin/pwd
来自 GNU coreutils 的 。当我发出cd //; pwd
(使用 shell 内置命令)时,它会键入//
.但是,当我发出cd //; /usr/bin/pwd
(使用外部)时,它会键入/
.两种情况下的实际工作目录(如ls
输出等所示)始终相同(FS 根目录)。
因此,答案似乎是涉及两个不同的概念:shell 的工作目录概念和实际进程 CWD。内置pwd
查询前者,而/usr/bin/pwd
(和任何其他二进制文件)只能访问后者,并且只有前者知道有关//
.为什么 shell 的工作目录概念要区分/
和//
,以及它的//
含义,我不知道。
编辑:一些搜索遇到这个问题,这提供了一些线索。显然这种奇怪的行为是符合标准的,尽管它仍然很奇怪。