O Shell Script Loader é a minha solução para isso.
Ele fornece uma função chamada include () que pode ser chamada várias vezes em vários scripts para referenciar um único script, mas carregará o script apenas uma vez. A função pode aceitar caminhos completos ou parciais (o script é pesquisado em um caminho de pesquisa). Também é fornecida uma função semelhante chamada load () que carregará os scripts incondicionalmente.
Ele funciona para bash , ksh , pd ksh e zsh com scripts otimizados para cada um deles; e outros shells que são genericamente compatíveis com o sh original, como ash , dash , relíquia sh , etc., por meio de um script universal que otimiza automaticamente suas funções, dependendo dos recursos que o shell pode oferecer.
[Exemplo conhecido]
start.sh
Este é um script inicial opcional. A colocação dos métodos de inicialização aqui é apenas uma conveniência e pode ser colocada no script principal. Este script também não é necessário se os scripts forem compilados.
#!/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
# ...
cinza
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 ----'
resultado:
---- b.sh ----
---- a.sh ----
---- main.sh ----
O melhor é que os scripts baseados nele também possam ser compilados para formar um único script com o compilador disponível.
Aqui está um projeto que o utiliza: http://sourceforge.net/p/playshell/code/ci/master/tree/ . Pode ser executado de forma portável, com ou sem a compilação dos scripts. A compilação para produzir um único script também pode acontecer e é útil durante a instalação.
Também criei um protótipo mais simples para qualquer parte conservadora que queira ter uma breve idéia de como um script de implementação funciona: https://sourceforge.net/p/loader/code/ci/base/tree/loader-include-prototype .bash . É pequeno e qualquer um pode incluir o código no script principal, se quiser, se o código for executado com o Bash 4.0 ou mais recente, e também não o usar eval
.