Você poderia fazer algo assim. Eu apenas o testei levemente, mas acho que o conceito geral é sólido.
Exemplo
Digamos que você tenha o seguinte diretório de arquivos:
$ ls -l
total 16
-rwxrwxr-x 1 saml saml 268 Oct 4 17:44 expander.bash
-rw-rw-r-- 1 saml saml 18 Oct 4 16:49 src_1.bash
-rw-rw-r-- 1 saml saml 20 Oct 4 16:50 src_2.bash
-rwxrwxr-x 1 saml saml 119 Oct 4 16:49 top.bash
O arquivo top.bash
tem esta aparência:
$ cat top.bash
#!/bin/bash
echo "1"
echo "2"
echo "3"
echo "4"
. src_1.bash
echo "15"
echo "16"
. src_2.bash
echo "27"
echo "28"
Você pode usar o seguinte script, expander.bash
para "expandir" top.bash
:
#!/bin/bash
while read -r line; do
if echo "$line" | grep -q '\. .*'; then
file=$(echo "$line" | sed 's/\. //')
echo "### below sourced from: $file"
cat $file
echo "### above sourced from: $file"
continue
fi
printf "%s\n" "$line"
done < top.bash
Exemplo de execução
$ ./expander.bash
#!/bin/bash
echo "1"
echo "2"
echo "3"
echo "4"
### below sourced from: src_1.bash
echo "6"
echo "7"
### above sourced from: src_1.bash
echo "15"
echo "16"
### below sourced from: src_2.bash
echo "17"
echo "18"
### above sourced from: src_2.bash
echo "27"
echo "28"
Melhorias Potenciais?
Por exemplo, usei grep
e sed
, eles poderiam ser trocados para torná-lo uma solução Bash mais pura. Eu não tive tempo para fazer isso, já que este é um protótipo bruto.
A segunda área que provavelmente precisará de atenção é a habilidade dos scripts de descobrir que uma fonte de outro arquivo está ocorrendo. O padrão que detecta isso provavelmente precisará ser "ajustado" com base na sua situação.