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

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

我见过许多命令既接受“BSD 语法”,也接受其标准语法。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 中的那些命令?

答案1

这可以追溯到Unix(维基百科有一个简图,即远的 完整)。 特别是在一段时间内,出现了两大潮流:系统 V由 AT&T 开发,北达科他州由加州大学伯克利分校开发。当时大约是 20 世纪 80 年代初期,比 Linux(1991 年)早得多,更不用说 Ubuntu(2004 年)了。这两个潮流经常做出不同的决定,即使在今天,你也会偶尔发现“System V”和“BSD”变体或功能的提及。

ps命令可以追溯到 Unix 的第一个版本(它不是版本 1,我在网上找到的最早的手册页来自版本 5(第 94 页)于 1974 年发布)。当时,ps只有几个选项,例如,ps a将显示所有进程而不仅仅是用户的进程,以及ps x将显示没有连接终端的进程。您会注意到,选项不是以 开头的-:当时,使用-选项的惯例并不像今天这样系统化,它主要是针对将文件名作为常规参数的命令。

随着时间的推移,Unix 的各个分支扩展ps了更多选项。BSD 变体选择保留原始语法,不带前导-,并且a至今x仍然存在。System V 变体选择采用 for 选项的语法约定-,并使用不同的字母(例如ps -e显示所有进程)。Oracle(前身为 Sun)索拉里斯是 System V 变体的一个例子(Solaris 还在ps非默认目录中提供了一个单独的可执行文件PATH,用于以 BSD 形式编写的应用程序)。

Linux 出现的时候,使用它的人往往已经有使用过一种或另一种 Unix 变体的经验。Linux 有时候按照 System V 的方式运行,有时候按照 BSD 的方式运行,有时候有自己的方式,这要么基于技术考虑,要么基于实现该功能的人的经验和品味。Linux 的ps命令最初提供类似 BSD 的选项,例如ps ae显示所有进程并在列表中包含环境变量。随着时间的推移(20 世纪 90 年代末,我不记得具体时间了),Linux 的作者ps为习惯使用 System V 的人添加了选项。所以今天,要么 要么ps ax都会ps -e列出 Linux 下的所有进程,甚至还有一个环境变量(PS_PERSONALITY),使其ps行为更像各种 Unix 旧变体,以方便旧脚本和有固定习惯的人使用。

使用过多个 Unix 变体的人不喜欢在从一个 Unix 变体切换到另一个 Unix 变体时必须修改他们的程序和习惯。因此,人们努力将一部分功能标准化。这导致了POSIX标准(由电气电子工程师学会),Ubuntu 大体上遵循了这一原则。第一版的范围包括该ps命令,出版于 1992 年;这一版在网上找不到,但1997 年版是。对于该ps命令,与许多其他情况一样,POSIX 采用了 System V 的做事方式。

ps命令的标准语法与 System V 和 POSIX 兼容。此外,该语法可以说是标准的,因为它-默认用于引入选项。有些选项只存在于两种语法中的一种中;幸运的是,它们可以混合在同一个调用中。

一般而言,“BSD” vs “System V” 没有任何技术含义。它指的是历史:“BSD” 是 BSD 在 20 世纪 80 年代左右做出的选择,“System V” 是 AT&T 及其合作伙伴(尤其是 Sun)做出的选择。“POSIX” 是 IEEE 标准化委员会做出的选择。

答案2

MS Office 和 LibreOffice 之间有什么区别?Firefox 和 Chrome 之间有什么区别?
它们的作用大致相同,但由不同的人开发,目的略有不同。

也许更好的问题是为什么 BSD、Linux、OSX 和 Unix 发行版共享所以有很多命令吗?这可以归结为POSIX合规性。POSIX 基本上是一套类 Unix 操作系统的标准;它规定了核心 API、命令以及这些命令的工作方式。

对于ps(POSIX 规定的命令),需要某些参数。这些参数包括 BSD 参数。所有 POSIX 衍生的命令都有自己的手册页,但需要单独安装。对于ps

sudo apt-get install manpages-posix
man 1posix ps

那么为什么 BSD 不使用我们的ps(反之亦然)?

  • 我们的ps包裹(procps参见dpkg -S $(which ps):)是叉子另一个procps包裹。这两个都是 GPL 许可的。这与 BSD 的许可证不兼容,因此不能包含在内。(我们可以包括 BSD,但不需要。
  • ps是相当内核特定的。我认为它们技术上不相容。

那么其他应用程序怎么样?

大多数符合 POSIX 要求的命令都来自 Ubuntu 的coreutils软件包。该软件包代表 GNU/Linux 中的 GNU,并且也获得了 GPL 许可。BSD 发布了自己的 BSD 兼容许可版本,这些版本遵循 POSIX,但不一定与 GNU 版本完全相同。

ps并不是唯一一个非 GNU 的 POSIX 命令。有很多。

正如我开头提到的,为什么会这样?它们是由不同的人在很长很长的一段时间内创作的。这就是我的简短回答。

答案3

您所指的“标准”语法实际上是 20 世纪 80 年代开发的 GNU 操作系统。基于 GNU 的实用程序和理念与 Linux 内核相结合,开发了大多数现代 Linux 发行版(包括 Ubuntu)。

BSD 操作系统是在 20 世纪 70 年代后期开发的,独立于 GNU,后来分支为 FreeBSD 或 OpenBSD 等现代版本。

GNU 和 BSD 都受到 Unix 的启发,并且它们的理念、语法等略有不同。

答案4

Ubuntu 的 coreutils 是 GNU 维护的应用程序的集合,其中包含大量内容(查看 apt-cache show coreutils)。BSD 有自己的版本(GNU 与 BSD 许可证不兼容)。

相关内容