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。
ps
Linux 的原始命令是这样编写的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 补丁ps
Michael 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 年代初引起了许多困惑的用户的疑问,并且当书籍开始说以下内容时,通常使系统管理员和用户感到困惑:
您可能想知道为什么我们不在带有 的标志之前使用破折号——黛博拉·S·雷和埃里克·J·雷 (1998)。UNIX系统。桃皮出版社。 ISBN 9780201353952。p。 174.ps
。您可以使用它们,但这ps
是老式的方式,您会收到关于坚持使用该程序的警告。
您仍然可以看到此讨论手册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
。
进一步阅读
答案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) 和一些现代扩展。