上次我在Linux 哲学的影响中讨论了 Linux 哲学的一个相当高层次的观点。关于它有一些非常好的讨论,许多博客联合发布了 Opensource.com 的内容。
我从上一篇文章收到的评论之一是,另一个操作系统在命令行上具有与 Linux 相同的功能。这个人说,你可以添加这个软件来获得这些功能,如果你想要那些功能,可以添加那个软件包。这正说明了我的观点。使用 Linux,这一切都是内置的。你不需要去其他地方来获得 Linux 的强大功能。
许多人留言说,他们可以看到了解 Linux 哲学作为一种历史的好奇心可能很好,但它在 Linux 环境中的日常操作中几乎没有意义。我不敢苟同。原因如下。
九大原则
Linux 哲学有九大原则。
- 小即是美
- 每个程序只做好一件事
- 尽快制作原型
- 选择可移植性而非效率
- 将数据存储在纯文本文件中
- 使用软件杠杆
- 使用 Shell 脚本来增加杠杆和可移植性
- 避免封闭的用户界面
- 将每个程序都做成过滤器
Linux 哲学还有 10 个较小的原则和一些推论也很重要。我将在以后的文章中介绍其中的一些。
这是一个快速的命令行程序示例,它包含了这九大原则中的大多数。
who | awk '{print $1}' | sort | uniq
这个小小的命令行程序执行一个非常简单的任务,即列出当前所有已登录用户,同时只列出每个已登录用户一次。它还消除了 who 命令提供的无关数据。
我不会介绍这个 CLI 程序符合 Linux 哲学的所有方式,但我可以很好地论证它符合其中的大多数原则。
将每个程序都做成过滤器
组成这个命令行程序的每个命令都是一个过滤器。也就是说,每个命令都会接受一个输入,通常来自标准输入,并通过对其进行一些更改来“过滤”数据流,然后将结果数据流发送到标准输出。标准输入和标准输出统称为 STDIO。
who 命令生成一个初始数据流。随后的每个命令都以某种方式更改该数据流,接受标准输入并将修改后的数据发送到标准输出,供下一个命令操作。
小即是美和
每个程序只做好一件事
这两个原则是紧密相关的。这个程序中的每个命令都相当小,并且每个命令都执行一个特定的任务。例如,sort 命令只做一件事。它对通过标准输入发送给它的数据流进行排序,并将结果发送到标准输出。它可以执行正序和倒序的数字、字母和字母数字排序。但它不做其他任何事情。它只排序,但在这方面非常非常出色。因为它非常小,如下表所示只有 2614 行代码,所以它也很快。
命令 | 源代码行数 |
who | 755 |
awk | 3412 |
sort | 2614 |
uniq | 302 |
选择可移植性而非效率和
使用 Shell 脚本来增加杠杆和可移植性
从长远来看,shell 脚本的可移植性可能比用编译语言编写程序所感知的效率更高—甚至没有考虑到编译和测试这样一个程序所需的时间—因为它们可以在许多其他不兼容的系统上运行。
例如,我曾在北卡罗来纳州立大学的电子邮件系统工作了几年。我负责一组在 Red Hat Linux 主机上运行的 Perl 和 BASH CGI 程序。这些程序为我们所有 100 个县和数百个大大小小的机构的远程用户提供了执行其用户帐户维护的功能。我被要求测试将所有这些程序迁移到在 IBM Z 系列大型机上运行的 Red Hat 的可能性。
我从现有程序、数据和配置文件创建了一个 tarball,将 tarball 复制到大型机上的 Red Hat 实例并解压了它。我对 Apache httpd.conf 文件做了一个配置更改—我更改了 Apache 监听的 IP 地址。我启动了 Apache,一切都按预期工作,无需其他更改。这一切大约花了十分钟,并且是真正的可移植性的绝佳示例。
如果这些程序是编译的,我就不得不重新编译它们,并删除我们可能已编程的任何特定于硬件的效率。
使用软件杠杆
软件杠杆对我来说意味着几件事。首先,在这个示例的上下文中,它意味着通过使用四个命令行命令,我们正在利用创建这些命令的程序员的工作,他们编写了超过 7,000 行的 C 代码。这是我们不必创建的代码。我们正在利用那些其他未被充分赏识的程序员的努力来完成我们为自己设定的任务。
软件杠杆的另一个方面是,优秀的程序员编写好的代码,伟大的程序员借鉴好的代码。永远不要重写已经编写好的代码。
开源软件在各个层面上的一个巨大优势,从内核到 GNU 和其他实用程序,一直到复杂的应用程序,在于那里有大量编写良好且经过测试的源代码,几乎可以完成您想做的任何事情。只需找到您需要的片段并将它们包含在您自己的代码中。我在不同的程序中多次使用我自己的代码。当其他人的代码满足我的需求时,我也会使用很多。无论哪种方式,它都为我节省了大量工作,并使我免于重新发明完全好用的代码。
影响
本文并非旨在作为编程教程。相反,它旨在说明 Linux 哲学如何影响和指导系统管理员和开发人员的日常工作。
我们是几十年代码的受益者,这些代码由那些真正了解自己在做什么并且非常投入的人们精心设计、深思熟虑和编写的。地球上最好的代码是使用这些原则编写的。
仅 GNU 实用程序就代表了 Richard Stallman 和其他程序员为向任何想要使用它们的人提供开放、免费的 Unix 实用程序而投入的大量时间和精力。这些 GNU 实用程序被 Linus Torvalds 纳入了最初的 Linux 发行版中。它们共同构成了 GNU/Linux,并为我们提供了一个非常强大且有用的操作系统和实用程序的来源。
GNU/Linux 为我们提供了免费和开放的工具,使我们能够执行极其复杂和富有创造性的任务,其中许多任务是使用任何其他工具都无法完成的。许多 这些小型的“只做好一件事”的GNU 实用程序是使用 STDIO 设计的,因此它们可以以大型、单体实用程序的程序员永远无法想象的方式组合在一起。事实上,这些 GNU 实用程序的程序员自己也不知道它们可以以几乎无限的组合方式组合在一起以执行他们无法想象的任务。然而,这些超过 40 年历史的实用程序仍然在世界各地的计算机上大量日常使用。
下次我将给您布置一个挑战。
参考文献
- Eric Raymond:Unix 编程艺术 http://www.catb.org/~esr/writings/taoup/html/index.html
- Mike Gancarz:Linux 和 Unix 哲学;Digital Press,2003 年,ISBN 1-55558-273-7
- 维基百科:http://en.wikipedia.org/wiki/Unix_philosophy
- 俄勒冈州立大学:http://web.engr.oregonstate.edu/~traylor/ece474/lecture_verilog/beamer/linux_philosophy.pdf
6 条评论