Shell Script Loader является моим решением для этого.
Он предоставляет функцию с именем include (), которая может вызываться много раз во многих сценариях для ссылки на один сценарий, но загружает сценарий только один раз. Функция может принимать полные или частичные пути (сценарий ищется в пути поиска). Также предусмотрена аналогичная функция load (), которая загружает сценарии безоговорочно.
Это работает для bash , ksh , pd ksh и zsh с оптимизированными скриптами для каждого из них; и другие оболочки, которые в общем совместимы с исходным sh, такие как ash , dash , heirloom sh и т. д., с помощью универсального сценария, который автоматически оптимизирует его функции в зависимости от функций, которые может обеспечить оболочка.
[Пример наград]
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
# ...
a.sh
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.