当前位置: 首页>>技术教程>>正文


标准语法和 BSD 语法有什么区别?

,

问题描述

我见过许多接受 “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 变体选择保留原始语法,没有前导 - ,并且 ax 今天仍然存在。 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 axps -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 命令。他们有很多。

正如我领导的那样,他们为什么要这样?他们在很长很长一段时间内都是不同的人。这就是这里的简短答案。

参考资料

本文由Ubuntu问答整理, 博文地址: https://ubuntuqa.com/article/12871.html,未经允许,请勿转载。