Yar*_*nux 9 linux bsd ps arguments
在psUbuntu 上的命令手册中有这样的文字:
此版本的 ps 接受多种选项:
Run Code Online (Sandbox Code Playgroud)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的起源是一样的,但它们是不同的分支。
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文件系统来读取进程表,并且在接下来的几年(例如1993年1 月,1994年1 月)发布了几个版本。
这些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 于 1990年4 月更改选项处理后,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 年代初引起了困惑用户的许多问题,并且当书籍开始说以下内容时,系统管理员和用户通常会感到困惑:
您可能想知道为什么我们不在带有——Deborah S. Ray 和 Eric J. Ray (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. Cahlan)的新版本确实将整个多重人格的想法推向了极端。不幸的是,此外,它仍然延续了关于 BSD 命令行选项的谣言,直到今天仍然如此。
同时,快乐的单身人士BSD在撰写此答案时ps已提供getopt()过去 29 年零 7 天的命令行选项解析;FreeBSD 获得了一个procstat命令;NetBSD 和 OpenBSDps已经跟踪了新的妥协-A选项;并且 Single Unix Specification 保留(但不包括)新的 BSD-O选项到ps.
procstat. FreeBSD 通用命令手册。ps. FreeBSD 通用命令手册。2018-03-13。ps. NetBSD 通用命令手册。2016-12-02。ps. OpenBSD 通用命令手册。2016-10-26。小智 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) 和一些现代扩展。