Shell Script Loader es mi solución para esto.
Proporciona una función llamada include () que se puede invocar muchas veces en muchos scripts para referir un solo script, pero solo cargará el script una vez. La función puede aceptar rutas completas o rutas parciales (el script se busca en una ruta de búsqueda). También se proporciona una función similar llamada load () que cargará los scripts incondicionalmente.
Funciona para bash , ksh , pd ksh y zsh con scripts optimizados para cada uno de ellos; y otros shells que son genéricamente compatibles con el sh original como ash , dash , heirloom sh , etc., a través de un script universal que optimiza automáticamente sus funciones dependiendo de las características que el shell pueda proporcionar.
[Ejemplo de Fowarded]
start.sh
Este es un script de inicio opcional. Colocar los métodos de inicio aquí es solo una conveniencia y se puede colocar en el script principal. Este script tampoco es necesario si se van a compilar los scripts.
#!/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
# ...
ceniza
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 ----'
salida:
---- b.sh ----
---- a.sh ----
---- main.sh ----
Lo mejor es que los scripts basados en él también pueden compilarse para formar un solo script con el compilador disponible.
Aquí hay un proyecto que lo usa: http://sourceforge.net/p/playshell/code/ci/master/tree/ . Puede ejecutarse de forma portátil con o sin compilar los scripts. Compilar para producir un solo script también puede suceder, y es útil durante la instalación.
También creé un prototipo más simple para cualquier partido conservador que quiera tener una breve idea de cómo funciona un script de implementación: https://sourceforge.net/p/loader/code/ci/base/tree/loader-include-prototype .bash . Es pequeño y cualquiera puede incluir el código en su script principal si lo desea, si su código está destinado a ejecutarse con Bash 4.0 o posterior, y tampoco lo usa eval
.