Linux 的 ps 命令中的 UNIX-、BSD-、GNU-选项。他们从哪里来?

Yar*_*nux 9 linux bsd ps arguments

psUbuntu 上的命令手册中有这样的文字:

此版本的 ps 接受多种选项:

   1   UNIX options, which may be grouped and must be preceded by a
       dash.
   2   BSD options, which may be grouped and must not be used with
       a dash.
   3   GNU long options, which are preceded by two dashes.
Run Code Online (Sandbox Code Playgroud)

为什么 Ubuntu 中内置的命令可能使用来自不同操作系统的选项?我知道Linux、UNIX和BSD的起源是一样的,但它们是不同的分支。

Jde*_*eBP 14

这完全是因为一个叫 Albert D. Cahlan 的人。Xe不知道BSD。

psLinux的原始命令由 Branko Lankester 于 1992 年 3 月编写并首次发布。后来被称为“kmem-ps”,以区别于Michael K. Johnson 于 1992 年 12 月发表的“proc-ps” 。M. Lankesterps使用该kmem设备从内核内存中读取进程表。M. Johnson'sps使用proc文件系统来读取进程表,并且在接下来的几年(例如19931 月19941 月)发布了几个版本。

这些ps命令为getopt()1980 年代早期的命令提供了相当古老的语法。这是1993 年 11 月发布的 kmem-ps

用法:ps 0acefhHjlmnprsStuUvwxXy [t tty] [pid[,pid]...]

j——作业控制格式,l——长格式,m——内存格式,
s——信号格式,u——用户格式,v——虚拟内存格式,
X -- 寄存器格式,y -- 系统调用格式,默认 -- 短格式

0 -- 包括任务零,a -- 包括所有用户的进程
c -- 只打印命令名称,e -- 显示环境变量,f -- 打印进程森林
h -- 取消标题,n -- 以数字方式打印 user 和 wchan 字段
p -- 以页为单位打印计数,r -- 将列表限制为可运行的进程
S -- 在 CPU 时间和页面错误字段中汇总子项的使用情况
t tty -- 显示所有以 TTY 为控制终端的进程
w -- 宽:132、ww -- 264、www -- 无限制、默认 -- 屏幕宽度或 80
x -- 包括没有控制终端的进程
U [SYSTEM-PATH [SWAP-PATH]] -- 更新ps数据库

正如您所看到的,有一个个性,字母的单一含义,并且没有前导减号字符。

U标志(不是-U,注意)的想法来自于1986 年psmod.sources由 Michael A. Callahan发布到 Usenet新闻组(作为第 6 卷第 83 期)的BSD 补丁

几年后,Albert D. Cahalan 出现了,他重写了 proc-ps。Xe 对此提出了很多要求。不幸的是,许多这些说法的揭穿已经被遗忘了,这些年来一直存在的是ps声称这ps提供了 Unix、BSD 和 GNU 选项语法的手册。

它不是。

自从 Marc Teitelbaum 于 19904 月更改选项处理后,BSDps就开始使用getopt()选项处理,比M. Lankester 的 Linux 版本早很多年,更不用说 M. Cahalan 的版本了。ps

M. Cahlanps提供了旧的 Linux kmem-ps/proc-ps 语法。它后来添加了一些 M. Cahlan 声称来自 AIXps命令的语法。M. Cahalan 在 Usenet 上坚定地提出了“BSD 很烂而 SysV 没有”的观点,FreeBSD“很烂”,并且 proc-ps 的 xyr 重写是“符合标准的/bin/ps”,支持“您过时的 BSD 语法”,具有讽刺意味的是,到那时,几乎十年来,这实际上并不是 BSD 语法。 而且,那一年ps本身才刚刚标准化。 标准的基本原理分析 BSD 与 AT&T Unix 命令行选项的对比比 M. Cahlan 的任何一个都深思熟虑。

ps著名地引入了I_WANT_A_BROKEN_PS环境变量,令人困惑的是 M. Cahlan 将责任归咎于 M. Johnson,同时声称 xyrself 负责选项解析。事实上,两人同时维护了两个ps实现

奇怪的是,如果使用getopt()-style 选项前面有减号,就像当时的 BSDps以及(当时)新的记录标准一样ps,Cahlan/Johnsonps会声明:

警告:`-' 已弃用;使用`ps e',而不是`ps -e'

实际上,-推荐使用它。事实上,M. Cahlan 所声称的就是 xyrps将以标准方式使用-——就像 BSDps已经那样。这在 1990 年代末和 2000 年代初引起了困惑用户的许多问题,并且当书籍开始说以下内容时,系统管理员和用户通常会感到困惑:

您可能想知道为什么我们不在带有ps. 你可以使用它们,但这ps是老式的方法,你会收到关于坚持使用程序的警告。
——Deborah S. Ray 和 Eric J. Ray (1998)。UNIX。桃坑出版社。ISBN 9780201353952. p. 174.

您仍然可以在手册中看到这一点,oldps手册谈到“源自“的 BSD 版本ps”,尽管它确实不是,但它显然是源自 Linux 版本;并指出“命令行参数不应以‘-’字符开头,因为将来,‘-’将用于表示 Unix98 标准的命令行参数,而没有‘-’将表示当前命令行参数的“扩展 BSD”样式”。

其中一些在 procps-ng 中被淡化了,这是在世纪之交之后完成的第三次重写(当时项目名称中的“-ng”是 à la mode),也就是 Cahalan/Johnsonps成为oldps. 如您所见,ps手册不再说“扩展”。但是ps仍然涉及 M. Cahlan)的新版本确实将整个多重人格的想法推向了极端。不幸的是,此外,它仍然延续了关于 BSD 命令行选项的谣言,直到今天仍然如此。

同时,快乐的单身人士BSD在撰写此答案时ps已提供getopt()过去 29 年零 7 天的命令行选项解析;FreeBSD 获得了一个procstat命令;NetBSD 和 OpenBSDps已经跟踪了新的妥协-A选项;并且 Single Unix Specification 保留(但不包括)新的 BSD-O选项到ps.

进一步阅读

  • 罗伯特 NM 沃森 (2017-01-14)。procstat. FreeBSD 通用命令手册
  • ps. FreeBSD 通用命令手册。2018-03-13。
  • ps. NetBSD 通用命令手册。2016-12-02。
  • ps. OpenBSD 通用命令手册。2016-10-26。

  • 令人印象深刻的研究。我希望这能迅速投票给最高层。旁注,在谈论 Albert Cahalan 时,我发现奇怪的代词会影响和分散注意力;您的研究是否发现该人特别喜欢这些代词?如果没有,让我们坚持使用标准的英语代词。 (3认同)
  • @Wildcard,谷歌搜索 ``"JdeBP" "Xe"`` (带有两组引号)产生大约 5000 次点击。我认为这表明作者不尊重卡哈兰偏爱的人称代词。 (2认同)
  • @RayButterworth,你有那些首选代词的来源吗? (2认同)
  • @ilkkachu,正如你所说,我们最终都会做出假设。如果我假设是“他/她”,那么我在 90%(你的数字)的情况下是正确的,并且在 10% 的情况下可能会冒犯某人。JdeBP 似乎假设“Xe”,因此 10% 的情况下是正确的,但 90% 的情况下可能会冒犯某人。哪个假设是明显错误的选择? (2认同)

小智 11

我只能给你一个整体的答案:命令行选项通常使用库函数解析getopt。最初它只接受由 - 后跟一个符号组成的参数。这有效地限制了您拥有的选项数量,或多或少 -A 到 -Z、-a 到 -z 和 -0 到 -9。您可以想象,如果没有至少对实际用途的提示,您将不会使用选项,例如 -h 用于帮助或 -v 用于版本信息或详细输出。

在 Linux 和通常关联的标准 C 库 glibc 中,getopt 的扩展也可以处理 -- 类似选项。随之而来的是许多在 GNU 下开发的命令(如 glibc)都使用了这个扩展。现在,对于许多命令,您还有类似 GNU 的样式选项。-v 和 --verbose、-h 和 --help 等等。我想在 BSD 中也发生了同样的事情(虽然我不是 BSD 人,请纠正我)。

您的ps命令来自一个名为 procps 的软件集合,我他们想模仿特定于某个平台的选项样式。所以对于 UNIX 的人来说,它有 - 选项。对于 BSD,它也接受诸如此类的东西ps aux

ps不是唯一的程序有这样的行为。许多标准程序都理解“旧”的 UNIX 风格 (POSIX) 和一些现代扩展。