10.2 使用“包含”和“溯源”重用代码

10.2 Reusing Code with Includes and Sourcing

译注:

Include 只有动词词性,意即“包含,包括”,并无名词词性。此处可以看作是动词名词化,意为被包含的文件。

Source 可以翻译为“从……获得”,也可以不翻译。对应的动名词可以译作“溯源”。

问题

有一组 Shell 变量赋值,你想要在你写的一组脚本中通用。你尝试把这些配置信息放到脚本文件中,但是当你在其它脚本中运行包含配置信息的脚本时,这些值并未跟过来;你的配置依旧运行在另一个 Shell 中,并且当那个 Shell 退出时,值也一并消失了。有什么办法能让配置脚本运行在当前 Shell 中么?

解决方案

使用 bash Shell 的 source 命令,或 POSIX 的单点 (.) 就可以读取配置文件中的内容了。当脚本文件中遇到这些命令或符号时,就会处理对应文件中的内容。

下面举例一个配置数据的例子:

以上简单的脚本中只包含了三次赋值。以下为另一个脚本,这个脚本会使用这些值:

讨论

想要使用配置文件的脚本可以使用 source 命令来读取文件中的内容。也可以使用一个点(.)取代单词 source。一个点儿输入起来更快更简单,但是却很难在脚本或截屏中引起注意:

你肯定不是第一个注意到点儿右面的内容,并且认为那个脚本就是曾经执行过的。

“溯源(Source)” 是一个非常强大的 bash 脚本特性,但它同时也非常危险。这个特性提供了一种创建一个配置文件且能在多个脚本中共享的方法。在这种机制中,你可以通过仅修改一个文件来实现修改配置,而不必修改多个脚本。

以下为修改过的配置文件:

这个配置文件几乎不像人们认为的被动配置变量列表。它可以运行其他命令(例如cat)并使用 if 语句来改变其选择。它甚至可以以输出一个消息来结束。当你想引用什么的时候,应当小心,因为这相当于在你的脚本里开了一扇大门。

引用脚本最合适的办法是定义 bash 函数(将在 10.3 中展示)。这些函数可以作为一组函数的公共库,在所有需要引用这些函数定义的脚本间共享。

参见

  • bash 手册页中更多与 readline 有关的内容。
  • 10.3 在脚本中使用配置文件
  • 10.4 定义函数

发表评论

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据