Unix系统中PWD的多种含义

2020-11-10 18:44:16

上周,我在Twitter上做了一项民意调查,看看人们对Unix和Linux系统中“pwd”的含义有什么看法。结果各不相同,或许是出于很好的原因。

2020年10月底,我在Twitter上进行了一次简短的民意调查,有82人参加了投票。这是那次民意调查,以及结果。它们是混杂在一起的,乍一看可能会令人惊讶。但这是有原因的,我们会发现这一点的。

最受欢迎的选项是“打印工作目录”。乍一看,这似乎是合乎逻辑的:“打印出当前的工作目录,即我现在所在的位置”。此外,不同版本的PWD手册中的描述有助于阐明这一概念。通常,我们会看到类似“打印当前/工作目录的名称”或“打印当前目录”之类的语句。

但是有很多命令可以打印东西,而且也是这样描述的。使用id命令。其中一个手册页是这样写的:“打印真实有效的用户和组ID”。又来了“印刷品”。但命令不是PID,而是ID。仔细想想,Unix中有许许多多的命令将信息发送到STDOUT,即发送到终端。这在某种程度上是他们中的许多人的观点。

这一次,维基百科的词条似乎只是表面上的确定,在pwd页面上写道:“pwd命令(打印工作目录)将当前工作目录的完整路径名写入标准输出”。似乎是为了强调这一声明充满希望的权威性,这里有五个(!)。应该链接到支持这一观点的资源的脚注。

遗憾的是,第一个脚注指向Wayback Machine的《UNIX程序员手册》(第七版,第一卷-1979年1月)的副本,其中实际上没有提到PWD(打印工作目录)的缩写:

我不知道你怎么想,但这份历史性的文件比我遇到的其他来源更有份量,它只会破坏维基百科词条的可信度。

其余的脚注链接充其量看起来是可疑的,除了一个指向关于PWD的GNU Coreutils手册的链接,它的名称是“打印工作目录”。但到目前为止,我所看到的其他一切都让我认为,这是一个出于明显而无辜的原因而传播的误解。此外,维基百科页面上没有用来支持这一说法的一个脚注是一个指向开放组织基础规范第7期2018年版关于pwd的信息的指针,几乎看起来它实际上完全避免了使用“打印”这个词:“返回工作目录名”…。Pwd实用程序应将当前工作目录的绝对路径名写入标准输出,该路径名不包含文件名点或点。非常具体,非常不公开。

所以我认为“打印工作目录”不是pwd的意思。事实上,“打印工作目录”可能在某些手册页中很常见,但在这台继承了BSD的MacOS机器上,我们使用的是:“pwd-返回工作目录名”。此外,它还说“pwd实用程序将当前工作目录的绝对路径名写入标准输出”。

因此,它可能真的是“工作目录的路径名”。至少对我来说,这会更有意义。它不仅避免了“print”的冗余,而且更具体地说明了输出-例如,如果我在/home/dja/中,那么调用pwd就会告诉我我所在的位置,包括整个路径,而不仅仅是dja:

至于其他选项,我确实喜欢“进程工作目录”,主要是因为它对我来说很有意义;Unix中的每个进程都有当前工作目录的概念,这正是我在Shell进程中进入pwd时所要求的-在视频Unix终端和Shell中有一部分很好地解释了这一点。

我很想指出一些旧的Unix资源来明确地解释这个问题,但不幸的是,搜索结果很少--Unix第5版和第6版中的PWD源代码都没有提供任何关于这方面的信息。

那么“当前工作目录”呢?嗯,这个选项似乎有腿,以Korn壳的形式出现。虽然有一个来源暗示答案很可能是“当前工作目录的路径名”,因为pwd只发出$pwd环境变量的值(而名为“打印工作目录”的变量根本没有意义)…。至少在ksh-land中,“当前工作目录”似乎是pwd所代表的。例如,以ksh手册页为例,它指出“pwd-由cd命令设置的当前工作目录”。

在这个问题上,有大量的直接和间接的讨论。以Unix&;Linux Stack Exchange论坛上的这两个条目为例:$pwd的词源和什么是$pwd?(VS当前工作目录)。当然,也许永远也找不到明确的答案,因为计算历史是千变万化的,而且容易出现分叉。

谈到历史,我们可以进一步追溯到Unix出现之前的根源,即Multics的形式,它间接地产生了Unix(最初的Unics)。在Multics命令列表中,我们看到,在其他类似名称的命令中,有一些东西让我们眼前一亮:

Print_mail(Pm)显示邮箱中的邮件print_Messages(Pm)显示邮箱中的交互消息print_motd(Pmotd)显示当日消息(源)print_proc_auth(PPA)显示进程的敏感度级别和分区print_request_type(PRT)显示I/O守护程序请求类型的列表print_search_path(PSP)显示搜索路径print_search_ules(PSR)显示就绪消息print_wsr

这里有pwd,实际上,就像它的兄弟pmotd一样,例如,它是print_motd的缩写,它是print_wdir的缩写。现在,考虑到最初的民意调查被设置为Unix和Linux的上下文,也许我们必须忽略这一信息。但是,作为一个对Unix历史非常着迷的人,我怎么能这样做呢?

我想没有什么可以下结论的。历史是丰富多彩的,也许我们永远不会确切地知道。也许,事实上,答案将取决于我们问的是谁。从大局来看,…真的无关紧要。但对于那些喜欢细枝末节的人来说,这是一个值得探索的有趣话题。