Aplanar script de shell (incluir scripts de origen) y eliminar funciones no utilizadas

Aplanar script de shell (incluir scripts de origen) y eliminar funciones no utilizadas

Estoy modificando manualmente los scripts de inicio de Debian para optimizar el tiempo de arranque de un dispositivo integrado. Hasta ahora lo he reducido a la mitad sólo con los "frutos maduros", es decir. los guiones más pequeños que son fáciles de entender.

Ahora me quedan algunos scripts de inicio que tardan unos 20 segundos en ejecutarse en total. Según la experiencia de los otros guiones, puedo ganar otros 5 a 10 segundos aquí. El problema es que esos scripts son demasiado difíciles de entender para mí porque obtienen varios scripts auxiliares /lib/init/que son difíciles de seguir ( mount-functions.shsiendo el primer culpable).

Para que los scripts restantes sean más fáciles de entender y poder optimizarlos, me gustaría alguna forma de "preprocesar" esos scripts de inicio para que cada vez que obtengan un archivo se incluya en el script mismo (de forma recursiva, por supuesto). ) y elimine las funciones no utilizadas para ordenar el código. ¿Existe una herramienta para esto?

Respuesta1

Podrías hacer algo como esto. Sólo lo he probado ligeramente, pero creo que el concepto general es sólido.

Ejemplo

Digamos que tiene el siguiente directorio de archivos:

$ 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

El top.basharchivo se ve así:

$ 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"

Puede utilizar el siguiente 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

Ejecución de ejemplo

$ ./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"

¿Posibles mejoras?

Por un lado, usé grepy sed, podrían intercambiarse para convertirla en una solución Bash más pura. No me tomé el tiempo para hacer esto, ya que es un prototipo aproximado.

La segunda área que probablemente necesitará atención es la capacidad de los scripts para descubrir que se está obteniendo otro archivo. Es probable que sea necesario "modificar" el patrón que detecta esto según su situación.

Respuesta2

La respuesta de @slmme inspiró a escribiraplanar.sh.

flatten.shno incluirá el archivo completo que se obtendrá. En su lugar, solo recuperará aquellas funciones definidas en el archivo que realmente se utilizan en el script que se está aplanando.

Esto es útil si mantiene un archivo "lazy.lib" que a su vez genera TODAS las funciones que utiliza. Simplemente ingrese "lazy.lib" en su script mientras lo desarrolla y aplánelo cuando haya terminado.

información relacionada