在另一个脚本 B 中重用脚本 A 有两种方法,是否正确:
脚本 B 作为命令调用脚本 A(B 创建一个子进程来运行 A)
我想知道什么时候使用哪种方式?
即使在两者都可以工作的情况下,出于什么原因,更倾向于选择哪一种?
谢谢。
答案1
两种方式都有效,但又截然不同。
通过在脚本 B 中使用脚本 A(将其作为命令调用),您可以单独使用脚本 A 来执行脚本 A 在没有脚本 B 的情况下执行的任何操作。
通过将脚本 A 的操作部分移至函数中,您可以将其转变为某种库。然后,除了定义许多函数之外,脚本 A 本身不会执行任何操作,而另一个脚本必须获取它并使用这些函数本身。
这两种方法都是完全有效的,而且都不是很罕见。使用哪一个完全取决于脚本 A 最初正在做什么、是否需要继续这样做(在这种情况下将其变成库是不可能的1)以及是否有比脚本 B 更多的脚本可以从该脚本的功能中受益A-as-a-library 会提供。
A第三显然,可能性是将脚本 A 和 B 中的所有公共位放入脚本 C 中的函数中,然后脚本 C 将充当函数库,其他两个脚本首先通过获取它来使用它。在极端情况下,除了可能的一些命令行解析和其他管理任务(例如组织输入和输出文件等)之外,这很可能使 A 和 B 中的一个或两个几乎为空。
1当然,也可以有一个可以执行的 shell 代码库。参见例如区分 bash shell 脚本中的运行和源代码?
我的问题是它不优雅(个人观点)。其他变化可见于这个 StackOverflow 答案它依赖于检测正在使用的 shell 类型并为每个 shell 执行不同的操作。
我对库即脚本的问题(除了依靠有些混乱的代码来检测它的使用方式之外)是它变成了一个奇怪的混合体事物它提供了两个完全独立的功能,具体取决于您如何调用它。它定义了另一个脚本在获取时可以选择的函数,但当用作命令时,它的行为类似于命令。为其编写手册会很尴尬(应该将其分类在哪个手册部分下?)...
我宁愿(这仍然是我个人的意见)将库位分离到纯 shell 库文件中,并从需要使用它的任何用户可调用脚本中获取该库文件。这将遵循与共享库与可执行二进制文件相同的设计。