Linux 和 BSD 都有常见的程序,例如ls
andcat
和echo
and kill
。
它们是否来自相同的源代码,或者 Linux 和 BSD 都拥有这些程序自己独特的源代码?
答案1
Linux是一个内核。 它首先没有应用程序的代码。
Linux-基于操作系统甚至不一定使用相同的源代码作为彼此,更不用说与 BSD 上相同的代码了。众所周知,几个相当基本的程序有多种实现。
这些包括但不限于:
ifconfig
有 2 个实现,其中之一是GNU inetutils另一个在NET-3 网络工具。现在有 3 个,第三个是我的。 (看https://unix.stackexchange.com/a/504084/5132.)su
有 2 个实现,其中之一是实用程序Linux另一个在阴影。 Debian 在 2018 年从一种切换到另一种,导致该 WWW 站点上的几个旧问题和答案出现错误。 (看https://unix.stackexchange.com/a/460769/5132举个例子,“su 与 su - (在 Debian 上):为什么 PATH 相同?”。)- 似乎有无数(在 Debian/Ubuntu 上实际上有 4 个)可能的地方可以获取该
mailx
命令:GNU Mailutils、BSD mailx、NMH 和 s-nail。 (看https://unix.stackexchange.com/a/489510/5132.)
BSD 是操作系统。 他们做包含这些程序的代码。然而,不存在单一的 BSD 操作系统,并且 NetBSD、FreeBSD、OpenBSD 和 DragonFly BSD 之间的此类程序的代码有时会有所不同。而且,它与几种基于 Linux 的操作系统使用的代码绝对不同。
众所周知,Apple/NeXT 在 MacOS/NeXTSTEP 中使用了 BSD 应用程序软件,但以与(其他)BSD 不同的方式增强了多个程序以支持 ACL。chmod
例如,可以使用命令设置访问控制。因此,这些命令的达尔文版本又有所不同。
还有三个额外的曲折。
kill
像和 这样的程序echo
通常是 shell 内置程序。 因此,这些命令的代码根据您使用的 shell 而不同,而不是操作系统。
然后是 BusyBox 和 ToyBox,它们都可用于基于 Linux 的操作系统和 BSD,甚至用作其中一些前者上此类命令的主要实现,它们有自己的实现许多命令。
然后是 OpenSolaris,它产生了像 Illumos 和 Schillix 这样的工具,所有这些工具都在 Solaris 上实现,这又是不同的。
这里有完整的历史,包括 BSD 和 AT&T Unix 之间最初的分裂,通过 20 世纪 80 年代末和 1990 年代“PD”克隆许多 Unix 程序的努力,此后大约三十年的洗牌,整个开源版本Solaris 的代码,以及 OpenBSD 的一些东西的重新实现。即使人们可能被误导的工具历史也有一种实现,例如cron
(很多人错误地认为这是原始的 Unix 工具,或者错误地认为至少是一种单一风格,cron
由 Paul Vixie 在 1987 年写为“PD”) ,或者没有意识到自那以后其他人写的类似的替代品)是不平凡的。
答案2
Linux 和 BSD 中的这些程序相同吗?
简短的回答是:不必要。
ls
、cat
、echo
、等常见程序的源代码kill
取决于什么用户区他们来自。换句话说,您的系统使用的用户区。 Linux 内核最常见的用户区是 GNU - 因此称为 GNU/Linux。然而,其他用户区已与 Linux 内核集成。
BSD 通常有自己的用户区,与 GNU 等其他用户区分开开发。甚至 BSD 本身也有不同的代码库。例如,FreeBSD 和 OpenBSD 都有一个“BSD userland”,但它们的代码库不同。如果您查看他们的手册页(ps
例如),他们有不同的可以使用的参数。
一个理由POSIX开发的目的是为了解决多个代码库的问题。如果随用户空间提供的通用实用程序符合 POSIX 标准,那么您可以确保它们的工作方式(几乎)相同,无论它们来自 GNU、FreeBSD、OpenBSD、AIX 还是其他基于 UNIX 的系统。
您可能知道,上面列出的用户区(AIX 除外)都是开源的。请随意浏览他们的代码存储库,您很快就会发现它们并不完全相同。
注意:尽管 GNU/Linux 是最流行的,但过去也曾尝试将 GNU 用户区与 FreeBSD/NetBSD 内核一起使用。您可以在维基百科上阅读有关它们的更多信息这里。
答案3
答案4
除了上面的正确答案之外,你会发现(几乎?)每个 Linux 发行版上的默认 shell 都是 bash,而至少 OpenBSD 和 FreeBSD 上的默认 shell 不是 bash。它可能是 csh 或 ksh,但自从我使用任何 BSD 变体以来已经有几年了,所以我不太确定。无论如何,它从来没有 bash 的功能,甚至重复前一个命令的方式也令人困惑。 shell 中的差异可能会改变哪些更简单的命令是 shell 内置命令以及哪些是独立程序。
现在有多个发行版为 GNU 用户区提供 xBSD 内核,并且可能反之亦然,因此对于这个问题没有一个绝对明确的答案。了解系统上有什么的唯一绝对万无一失的方法是使用包管理器下载源代码并检查它,或者如果您的发行版具有可浏览的源代码,则在线检查它,尽管检查适用的许可证将给出相当的信息。良好的指示。