Shell Script Loader是我的解决方案。
它提供了一个名为include()的函数,该函数可以在许多脚本中多次调用以引用单个脚本,但仅加载一次脚本。该函数可以接受完整路径或部分路径(在搜索路径中搜索脚本)。还提供了一个名为load()的类似函数,该函数将无条件加载脚本。
它适用于bash,ksh,pd ksh和zsh,并且每个脚本都有优化的脚本。以及其他与原始sh(例如ash,dash,heirloom sh等)一般兼容的shell,它们通过通用脚本根据其可提供的功能自动优化其功能。
[有重点的例子]
start.sh
这是一个可选的启动脚本。将启动方法放在这里只是一种方便,可以将其放在主脚本中。如果要编译脚本,则也不需要此脚本。
#!/bin/sh
# load loader.sh
. loader.sh
# include directories to search path
loader_addpath /usr/lib/sh deps source
# load main script
load main.sh
main.sh
include a.sh
include b.sh
echo '---- main.sh ----'
# remove loader from shellspace since
# we no longer need it
loader_finish
# main procedures go from here
# ...
灰
include main.sh
include a.sh
include b.sh
echo '---- a.sh ----'
b.sh
include main.sh
include a.sh
include b.sh
echo '---- b.sh ----'
输出:
---- b.sh ----
---- a.sh ----
---- main.sh ----
最好的是,基于该脚本的脚本也可以与可用的编译器一起编译为单个脚本。
这是一个使用它的项目:http : //sourceforge.net/p/playshell/code/ci/master/tree/。无论是否编译脚本,它都可以方便地运行。生成单个脚本的编译也可能发生,这在安装过程中很有帮助。
我还为可能希望对实现脚本的工作原理进行简要介绍的任何保守派人士创建了一个更简单的原型:https : //sourceforge.net/p/loader/code/ci/base/tree/loader-include-prototype .bash。它很小,任何人都可以在自己的主脚本中包含该代码,如果他们希望其代码旨在与Bash 4.0或更高版本一起运行,并且也不会使用eval
。