对话 UNIX,第 12 部分: 自己动手完成项目

Unix?系统中提供了数百个实用工具应用程序或者命令 。其中一些命令可以操作文件系统,而其他的命令则用于查询并控制操作系统本身 。大量的命令提供了连接性,并且还有更丰富的命令可用于生成、交换、修改、筛选和分析数据 。由于 UNIX 具有悠久而丰富的历史,所以您也许能够找到恰好合适的工具,以用于手头的任务 。
此外,当一个实用工具不能满足需求时,您可以通过各种各样的方式结合任何数量的 UNIX 实用工具,以创建您自己的工具 。正如您在前面的部分中所看到的,可以利用管道、重定向和条件,直接在命令行中构建即时可用的工具,并且 Shell 脚本将小型的、易于学习的编程语言的强大功能与 UNIX 命令结合在一起,以构建可重用工具 。
当然,在很多情况下,仅依靠命令行和 Shell 脚本是不够的 。例如,如果您必须部署一个新的守护进程以提供新的网络服务,那么您可以使用一种表达能力更强的语言,如 C 或者 Python,以便自己编写应用程序 。并且,因为 Internet 上有许多应用程序是免费的(免费 意味着无需支付任何费用、得到自由条款的许可,或者两者都有),所以您还可以下载、编译并安装适当的、有效的解决方案,以满足您的需求 。
UNIX(以及 Linux┑男矶喟姹径继峁┮恢殖莆芾砥?的特殊工具,用以在系统中添加、删除和维护软件 。包管理器通常可以维护本地安装的所有软件的详细目录,以及一个或者多个远程存储库 中所有可用软件的目录 。您可以使用包管理器在存储库中搜索您所需要的软件 。如果存储库中包含您正在寻找的软件,那么您只需要使用一个命令或者点击几下鼠标,就可以在您的系统中安装一个新的包 。
包管理器是非常有价值的 。使用它,您可以删除全部的包、更新现有的包,以及为任何包自动地检测并实现任何先决条件 。例如,如果您选择了操作图像的软件,如可靠的 ImageMagick,但是您的系统中缺少处理 JPEG 图像的库,那么包管理器将在安装您所选择的包之前检测并安装缺少的内容 。
然而,也可能存在这样的情况,即您所需要的软件是可获得的,但它却不包含于任何存储库中 。由于包管理方式具有显著的优势,所以大多数软件都提供了可以使用包管理器进行下载并安装的形式 。然而,因为 Unix 的版本和风格非常之多,所以很难针对每种特定的变体,以各种包管理器的格式提供每个应用程序 。如果您的 UNIX 安装是主流的,并受到大量拥护者的喜爱,那么您将更有可能找到预先构建的并且可供使用的软件 。否则,您就需要挽起袖子准备自己动手构建软件了 。
是的,年轻的绝地武士(《星球大战》中的武士),是使用源代码的时候了 。
如同从沼泽中升起一架 X 翼战斗机一样,从源代码构建软件乍看起来可能是令人生畏的,特别当您不是软件开发人员的时候 。事实上,在大多数情况下,整个构建过程仅仅只需要少数几条命令,其余的工作都是自动完成的 。
当然,某些程序构建起来是非常复杂的(或者需要花费数小时来进行构建),并且在构建过程中需要进行人工介入 。然而,即使这些程序通常是由一些容易构建的较小的块构造而得到的,依赖关系的数量和构造的顺序也会使构建过程变得复杂 。一些程序还有许多您并不一定希望拥有的特性 。例如,您可以构建 PHP,以便与新的网际协议版本 6 (IPv6) Internet 寻址方案进行互操作 。如果您的网络尚未采用 IPv6,则不需要包括这个特性 。对大量选项进行的审查将使构建过程变得更加麻烦 。
这个月,让我们来研究如何构建一个典型的 UNIX 软件应用程序 。在继续学习后面的内容之前,请确保系统中安装了 C 编译器,如 GNU 编译器套装(GNU Compiler Collection,GCC),以及常见的 UNIX 软件开发工具套装,包括 make、m4、pkg-config 和 awk 。此外,请确保在您的 PATH 环境变量中包含了所有的开发工具 。

推荐阅读