进一步阅读

进一步阅读

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

此版本的 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.

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

答案1

这一切都是因为一个名叫阿尔伯特·D·卡哈兰的人。 Xe 不懂 BSD。

psLinux 的原始命令是这样编写的Branko Lankester 于 1992 年 3 月首次发表。后来它被称为“kmem-ps”,以区别于“proc-ps”迈克尔·K·约翰逊 (Michael K. Johnson) 于 1992 年 12 月出版。 M. Lankesterps使用该kmem设备从内核内存中读取进程表。 M. Johnsonps使用proc文件系统来读取进程表,并且在接下来的几年中发布了多个版本(例如1993年1月,1994年1月)。

即使在当时,这些ps命令也提供了相当古老的命令语法,其风格可以追溯到getopt()20 世纪 80 年代前期。这是来自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 年 BSD 补丁psMichael A. Callahan将其发布到 Usenetmod.sources新闻组(第 6 卷第 83 期)。

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

它不是。

BSDps使用了getopt()选项处理自 Marc Teitelbaum 于 1990 年 4 月更改为如此以来,甚至早于 M. Lankester 的 Linux 版本ps,更不用说 M. Cahalan 的版本了。

M. Cahalanps提供了旧的 Linux kmem-ps/proc-ps 语法。后来它添加了一些 M. Cahalan 声称来自 AIXps命令的语法。 M. Cahalan,他在 Usenet 上坚定地提出了这样的观点:“BSD 很糟糕,而 SysV 则不然”FreeBSD“糟透了”proc-ps 的 xyr 重写是“符合标准/bin/ps”,支持“过时的 BSD 语法”具有讽刺意味的是,当时并没有意识到这实际上已经不是 BSD 语法了近十年了。 ps本身有刚刚去过此外,当年标准化。 标准原理分析BSD 与 AT&T Unix 命令行选项的比较比 M. Cahalan 的任何一篇都周到得多。

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

奇怪的是,如果使用getopt()-style 选项前面带有减号,就像ps当时 BSD 的情况一样,并且作为ps记录的(当时)新标准,Cahalan/Johnsonps会指出:

警告:“-”已弃用;使用“ps e”,而不是“ps -e”

其实,本来就是不是使用-它已被弃用。事实上,M. Cahalan 声称 xyrps将以标准方式工作-——就像 BSDps已经那样。这在 20 世纪 90 年代末和 2000 年代初引起了许多困惑的用户的疑问,并且当书籍开始说以下内容时,通常使系统管理员和用户感到困惑:

您可能想知道为什么我们不在带有 的标志之前使用破折号ps。您可以使用它们,但这ps是老式的方式,您会收到关于坚持使用该程序的警告。
——黛博拉·S·雷和埃里克·J·雷 (1998)。UNIX系统。桃皮出版社。 ISBN 9780201353952。p。 174.

您仍然可以看到此讨论手册oldps其中谈到“源自 BSD 版本ps”,尽管事实并非如此,但它相当明显地源自 Linux 版本;其中指出“命令行参数前面不应有‘-’字符,因为将来将使用‘-’来指示 Unix98 标准命令行参数,而不再使用‘-’来指示当前命令行参数的“扩展 BSD”风格”。

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

与此同时,幸福的单身的-personality BSD在撰写本答案时ps已经提供了过去 29 年零 7 天的命令行选项解析; getopt()FreeBSD 已经获得了procstat指挥权; NetBSD 和 OpenBSDps已经跟踪了新的妥协-A选项; Single Unix 规范保留了(但不包括)新的 BSD-O选项ps

进一步阅读

  • 罗伯特·N·M·沃森 (2017-01-14)。procstatFreeBSD 通用命令手册
  • psFreeBSD 通用命令手册。 2018年3月13日。
  • psNetBSD通用命令手册。 2016年12月2日。
  • psOpenBSD 通用命令手册。 2016年10月26日。

答案2

我只能给你一个总体的答案:命令行选项通常是使用库函数来解析的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) 和一些现代扩展。

相关内容