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, sesource
linha não foi recuada, como em seu exemplo)