Achate o script de shell (inclua scripts de origem) e remova funções não utilizadas

Achate o script de shell (inclua scripts de origem) e remova funções não utilizadas

Estou ajustando manualmente os scripts de inicialização do Debian para otimizar o tempo de inicialização de um dispositivo incorporado. Até agora, reduzi pela metade apenas com os "frutos mais fáceis de alcançar", ou seja. os scripts menores que são fáceis de entender.

Agora fico com alguns scripts de inicialização que levam cerca de 20 segundos para serem executados no total. Com base na experiência de outros scripts, posso ganhar mais 5 a 10 segundos aqui. O problema é que esses scripts são um pouco difíceis de entender porque eles fornecem vários scripts auxiliares /lib/init/que são difíceis de seguir ( mount-functions.shsendo o primeiro culpado).

Para tornar os scripts restantes mais fáceis de entender para que eu possa otimizá-los, gostaria de alguma forma de "pré-processar" esses scripts de inicialização para que sempre que eles originarem um arquivo, ele seja embutido no próprio script (recursivamente, é claro ) e remova as funções não utilizadas para organizar o código. Existe uma ferramenta para isso?

Responder1

Você poderia fazer algo assim. Eu testei apenas 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 top.basharquivo fica assim:

$ 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ê poderia usar o seguinte script expander.bashpara "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 um lado, usei grepe sed, eles poderiam ser trocados para torná-lo uma solução Bash mais pura. Não perdi tempo para fazer isso, pois este é um protótipo rudimentar.

A segunda área que provavelmente precisará de atenção é a capacidade dos scripts de descobrir que está ocorrendo a origem de outro arquivo. O padrão que detecta isso provavelmente precisará ser "ajustado" com base na sua situação.

Responder2

Resposta de @slmme inspirou a escreverachatar.sh.

flatten.shnão incluirá o arquivo inteiro a ser originado. Em vez disso, ele buscará apenas as funções definidas no arquivo, que são realmente usadas no script que está sendo nivelado.

Isso é útil se você mantiver um arquivo "lazy.lib" que, por sua vez, fornece TODAS as funções que você usa. Basta inserir "lazy.lib" em seu script durante o desenvolvimento e nivelá-lo quando terminar.

informação relacionada