BASH cole arquivos originados na fonte principal

0

Eu tenho um projeto BASH bastante grande, que eu divido em vários arquivos para torná-lo mais legível. Como resultado, o arquivo principal contém muitas instruções source .

Agora estou lançando no GitHub e estou escrevendo um script de instalação para ele. O problema é que criar subdiretórios em pastas binárias (exatamente /usr/local/sbin ) é proibido pelo FHS e não quero bagunçar pastas binárias com vários arquivos como main.bash config.bash , etc.

Como solução, pensei que, se o script de instalação mesclasse esses arquivos, eu obteria um arquivo BASH grande e monolítico, que pode ser colocado em qualquer parte do sistema.

A questão é: como posso substituir todas as declarações source no meu script principal pelo conteúdo dos arquivos originados?

Exemplo:

included.bash

echo "bar"

main.bash

echo "foo"
source included.bash

Arquivo monolítico resultante

echo "foo"
echo "bar"
    
por psimon 28.06.2014 / 21:12

1 resposta

1

Esse script, que pode ser chamado de make-monolithic.bash , percorrerá cada linha em main.bash e procurará uma instrução source . Se não houver correspondência, basta copiar a linha para o arquivo monolithic.bash . No entanto, se uma linha source for encontrada, o nome do arquivo será extraído e o conteúdo desse arquivo será copiado para monolithic.bash , em vez da linha original source .

#!/usr/bin/env bash

readonly MAIN="main.bash"
readonly MONOLITHIC="monolithic.bash"

[ -f "$MONOLITHIC" ] && cp "$MONOLITHIC" "${MONOLITHIC}.bak"

## to extract sourced filename
regex='^\([[:space:]]*\)source[[:space:]]\+\([^[:space:]]\+\)[[:space:]]*$'

IFS=$'\n'  ## retain whitespace

while read main_line; do
    sourced=$(echo "$main_line" | sed -n "s/$regex//p")
    if [ -n "$sourced" ]; then
        indent=$(echo "$main_line" | sed -n "s/$regex//p")
        while read sourced_line; do
            echo "${indent}${sourced_line}" >> "$MONOLITHIC"
        done < "$sourced"
    else
        echo "$main_line" >> "$MONOLITHIC"
    fi
done < "$MAIN"

unset IFS

[ -f "${MONOLITHIC}.bak" ] && rm "${MONOLITHIC}.bak"
  • testado no seu exemplo fornecido
  • também ignora os possíveis problemas de espaço em branco na linha source
  • plus: aplica automaticamente a mesma quantidade de recuo ao conteúdo do arquivo originado, conforme encontrado antes da instrução source (nenhuma, se source linha não foi recuada, como em seu exemplo)
por 29.06.2014 / 00:50