'光盘 //; pwd' # 这里发生了什么?

'光盘 //; pwd' # 这里发生了什么?

一位同事刚刚指出了一些奇怪的事情,我很好奇可能的解释是什么。

在我尝试过的系统上,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 的工作目录概念要区分///,以及它的//含义,我不知道。

编辑:一些搜索遇到这个问题,这提供了一些线索。显然这种奇怪的行为是符合标准的,尽管它仍然很奇怪。

相关内容