问题描述
我见过许多接受 “BSD syntax” 及其标准语法的命令。以 ps
命令为例:
To see every process on the system using standard syntax:
ps -e
ps -ef
ps -eF
ps -ely
To see every process on the system using BSD syntax:
ps ax
ps axu
那么这两条路线有什么区别呢?一般来说,当他们用 BSD 语法说我应该记住哪些元素时?这种语法是否也仅适用于它们在 BSD 中的那些命令?
最佳思路
这可以追溯到 Unix 的曲折历史(维基百科有一个 simplified diagram ,它是 far from 完整的)。尤其是一时间,有两大流派:AT&T开发的System V和加州大学伯克利分校开发的BSD。那是在 1980 年代初,早于 Linux(1991),更不用说 Ubuntu(2004)了。这两种潮流经常做出不同的决定,即使在今天,您也会发现偶尔会提到 \u201cSystem V\u201d 和 \u201cBSD\u201d 变体或功能。
ps
命令可以追溯到 Unix 的第一个版本(它不在版本 1 中,我可以在网上找到的最早的手册页来自 1974 年的 version 5 (p.94))。当时,ps
只有几个选项,例如 ps a
将显示所有进程而不仅仅是用户的进程,ps x
将显示未连接终端的进程。您会注意到选项不以 -
开头:当时,使用 -
作为选项的约定不像今天那样 near-systematic,它主要是用于将文件名作为普通参数的命令。
随着时间的推移,Unix 的各种分支扩展了 ps
并提供了更多选项。 BSD 变体选择保留原始语法,没有前导 -
,并且 a
和 x
今天仍然存在。 System V 变体选择采用 -
的语法约定作为选项,并使用不同的字母(例如 ps -e
显示所有进程)。 Oracle(以前称为 Sun)Solaris 是 System V 变体的一个示例(Solaris 还提供了一个单独的 ps
可执行文件,位于默认 PATH
上的目录中,用于使用 BSD 编写的应用程序)。
在 Linux 出现时,使用它的人通常会事先体验过一种或另一种 Unix 变体。 Linux 有时采用 System V 的方式,有时采用 BSD 的方式,有时采用自己的方式,要么基于技术考虑,要么基于实现该功能的人的经验和品味。 Linux 的 ps
命令以 BSD-like 选项开始,例如ps ae
显示所有进程并在列表中包含环境变量。随着时间的推移(在 1990 年代后期,我不记得确切的时间),Linux 的 ps
的作者为习惯于 System V 的人添加了选项。所以今天 ps ax
或 ps -e
将列出 Linux 下的所有进程,甚至还有一个环境变量( PS_PERSONALITY
)使 ps
的行为更像各种 Unix 旧 Unix 变体,为了旧脚本和有固定习惯的人。
使用多个 Unix 变体的人不喜欢在从一种 Unix 变体切换到另一种时必须修改程序和习惯。因此,人们努力将功能子集标准化。这导致了 POSIX 标准(由 IEEE 领导),Ubuntu 大体上遵循该标准。范围包括 ps
命令的第一版于 1992 年问世;这个不在网上,但 1997 edition 是。对于 ps
命令,与许多其他情况一样,POSIX 采用了 System V 的处理方式。
ps
命令的标准语法与 System V 和 POSIX 兼容。此外,该语法可以说是标准的,因为它默认使用 -
来引入选项。某些选项仅存在于两种语法之一中;幸运的是,它们可以在同一个调用中混合使用。
一般来说,\u201cBSD\u201d vs \u201cSystem V\u201d 没有任何技术含义。它指的是历史:\u201cBSD\u201d 是 BSD 在 1980 年代及以后做出的任何选择,\u201cSystem V\u201d 是 AT&T 及其合作伙伴(尤其是 Sun)做出的任何选择。 \u201cPOSIX\u201d 是 IEEE 标准化委员会做出的任何选择。
次佳思路
MS Office 和 LibreOffice 有什么区别?在 Firefox 和 Chrome 之间?\n它们做的事情大致相同,但它们是由不同的人完成的,目的略有不同。
也许更好的问题是为什么 BSD、Linux、OSX 和 Unix 发行版共享这么多命令?这归结为 POSIX 合规性。 POSIX 基本上是一套 Unix-like 操作系统的标准;它规定了核心 API、命令以及这些命令应该如何工作。
在 ps
(POSIX-stipulated 命令)的情况下,需要某些参数。这些包括这些 BSD 的。所有 POSIX-derived 命令都有自己的手册页,但它们需要单独安装。对于 ps
:
sudo apt-get install manpages-posix
man 1posix ps
那么为什么 BSD 不使用我们的 ps
(反之亦然)?
-
我们的
ps
封装(procps
见:dpkg -S $(which ps)
)另一个procps
封装的 is a fork。这两个都是 GPL 许可的。这与 BSD 的许可证不兼容,因此不能包含在其中。 (我们可以包括 BSD,但不需要)。 -
ps
是相当内核特定的。我认为它们在技术上是不兼容的。
其他应用程序呢?
大多数 POSIX 合规性命令来自 Ubuntu 的 coreutils
包。这个包代表了 GNU/Linux 中的 GNU,它也是 GPL 许可的。 BSD 发布了自己的 BSD-compatible-licensed 版本,这些版本遵循 POSIX,但不一定与它们的 GNU 版本完全相同。
ps
不是唯一不是 GNU 的 POSIX 命令。他们有很多。
正如我领导的那样,他们为什么要这样?他们在很长很长一段时间内都是不同的人。这就是这里的简短答案。