No momento, estou desenvolvendo um script Bash maior (é um projeto meu de código aberto) e está começando a se tornar uma bagunça. Dividi a lógica em funções, use variáveis locais onde posso e declarei apenas algumas variáveis globais. Ainda assim, está se tornando muito difícil de manter.
Pensei em dividir o script em vários scripts e originá-los no meu script principal (semelhante às importações em outros idiomas).
Mas me pergunto se essa é uma abordagem viável. Primeiro, o fornecimento de vários scripts pode diminuir bastante o tempo de execução do script e, segundo, torna a distribuição mais difícil.
Então, essa é uma boa abordagem e outros projetos (de código aberto) fazem da mesma maneira?
Respostas:
Sim, é uma prática comum. Por exemplo, nos primeiros dias do Unix, o código do shell responsável por guiar o sistema através de suas fases de inicialização até a operação multiusuário era um único arquivo
/etc/rc
,. Hoje, o processo de inicialização é controlado por muitos scripts de shell, divididos por função, com funções e variáveis comuns originadas conforme necessário em locais centrais. Distribuições Linux, Macs, BSDs, todos adotaram essa abordagem em graus variados.fonte
O shell é a ferramenta certa para o trabalho nesse ponto? Como desenvolvedor que se deparou com problemas de código de superação, posso dizer que uma reescrita não deve ser considerada, mas, em vez disso, considerar a separação de peças em algo mais adequado para a escala que você deseja aumentar seu aplicativo - talvez python, ruby ou perl ?
O Shell é uma linguagem de utilitário - é uma linguagem de script - e, portanto, será difícil expandi-lo para esses tamanhos.
fonte
Se facilitar sua manutenção, você pode ter os dois. Divida-o em partes lógicas para que você possa mantê-lo facilmente e, em seguida, escreva (por exemplo) um Makefile para reunir tudo para distribuição. Você pode escrever alguns scripts rápidos para copiar as funções do arquivo de inclusão para o arquivo de saída no lugar de na
source
linha ou apenas faça algo trivial como este (você terá que re-tabificar isso, conformemake
necessário)Você tem uma versão "fonte" (usada para edição) e uma versão "binária" (usada para instalação trivial).
fonte
Um script pode ser dividido conforme você descreve - quase tudo pode ser feito. Eu diria que a 'boa abordagem' seria compartimentar seu script grande, descobrir onde partes dele poderiam ser executadas como um processo separado, comunicando-se através dos mecanismos do IPC.
Além disso, para um script de shell, eu o empacotaria como um único arquivo. Como você diz, isso dificulta a distribuição: você precisa saber onde os scripts da 'biblioteca' estão localizados - não há um bom padrão para scripts de shell - ou confiar no usuário para definir seu caminho corretamente.
Você pode distribuir um programa de instalação que lida com tudo isso para você, extraindo os arquivos, colocando-os no local apropriado, pedindo ao usuário para adicionar algo parecido
export PROGRAMDIR=$HOME/lib/PROGRAM
com o arquivo ~ / .bashrc. Em seguida, o programa principal poderá falhar se$PROGRAMDIR
não estiver definido ou não contiver os arquivos que você espera.Eu não me preocuparia tanto com a sobrecarga de carregar os outros scripts. A sobrecarga é realmente apenas abrir um arquivo; o processamento do texto é o mesmo, especialmente se forem definições de função.
fonte
Prática comum ou não, não acho que terceirizar nada além de um conjunto de exportações seja uma boa idéia. Acho que a execução do código de fornecimento é apenas confusa e limita a reutilização, porque as configurações ambientais e outras variáveis tornam o código de origem altamente dependente do código de fornecimento.
É melhor dividir seu aplicativo em scripts menores e independentes e executá-los como uma série de comandos. Isso facilitará a depuração, pois você pode executar cada script independente em um shell interativo, examinando arquivos, logs, etc. entre cada chamada de comando. Seu script de aplicativo grande e único se transforma em um script de controle mais simples, que executa apenas uma série de comandos após a depuração.
Um grupo de scripts menores e independentes se depara com o problema mais difícil de instalar.
fonte
Uma alternativa ao fornecimento dos scripts é simplesmente chamá-los com argumentos. Se você já dividiu a maior parte de sua funcionalidade em funções shell, provavelmente já está quase pronto para fazer isso. O seguinte snippet do Bash permite que qualquer função declarada em um script seja usada como subcomando:
A razão para não fazê-lo
source
é evitar a poluição do meio ambiente e das opções.fonte
Aqui está o meu exemplo de como um script bash grande pode ser dividido em vários arquivos e, em seguida, incorporado em um script resultante: https://github.com/zinovyev/bash-project
Eu uso um
Makefile
para este fim:fonte