Eu faço ambos dependendo da circunstância. Na maioria dos casos, declararei as funções no mesmo script que as utilizarei, no entanto, tenho um "kit de ferramentas" de scripts que tem um arquivo de variáveis e funções a serem compartilhadas entre todos os scripts.
Para funcionar ou não funcionar
O principal objetivo de uma função é DRY (não se repetir). Se você tiver algum código que será usado mais de uma vez no seu script, ele deve estar em uma função.
O uso de funções em código não repetitivo é uma questão de preferência. Algumas pessoas (inclusive eu) consideram que é mais puro. Além disso, acho que se assemelha mais ao modo como as linguagens de programação "reais" são usadas.
O Manual de estilo da Shell do Google afirma que, se o seu código contiver pelo menos uma função, você deverá usar um "principal" funciona como um wrapper para todo o seu código. (Essencialmente, o seu script será apenas uma série de declarações de função, terminando com uma única chamada para main
)
Declarando funções (ou escrevendo código) dentro de um único script
- Simples (qualquer um que procure pelo código poderá rastrear mais facilmente o que cada função faz)
- Aumenta a portabilidade (somente um arquivo precisa ser movido de sistema para sistema)
Se você estiver escrevendo um script autônomo para realizar uma única tarefa, esse provavelmente é o caminho a ser seguido.
Declarando funções dentro de um arquivo separado
- DRY (não se repita)
- Pode ser mais fácil de gerenciar
Se você estiver criando um conjunto de ferramentas que compartilham muitas funções comuns, esse é provavelmente o caminho a seguir.
No meu exemplo, tenho funções que são usadas por todos ou pelo menos a maioria dos scripts no kit de ferramentas. Isso inclui algumas funções que consultam nosso sistema de gerenciamento de inventário e retornam informações sobre servidores, como endereço IP, versão do SO, etc. Essas informações são úteis para muitas das ferramentas, portanto, faz sentido declarar essas funções em um arquivo em vez de em todas as arquivos individualmente. Além disso, recentemente fizemos alterações no sistema de gerenciamento de inventário, de modo que, em vez de ter que alterar mais de 10 arquivos diferentes, eu só tive que alterar o arquivo comum para consultar o novo sistema, os outros arquivos ainda funcionam corretamente sem modificações.
Algumas desvantagens disso são que é mais complexo. Cada arquivo tem a seguinte instrução para originar este arquivo comum:
if [[ -f "${0%/*}/lib/common.sh" ]]; then
. "${0%/*}/lib/common.sh"
else
echo "Error! lib/common.sh not found!"
exit 1
fi
Se os usuários pegarem o kit de ferramentas e modificarem a estrutura de diretórios ou não agarrarem toda a estrutura de diretórios, as ferramentas não funcionarão como deveriam, porque não poderão originar o arquivo comum.