上次我在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 条评论