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.sh
siendo 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.bash
archivo 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.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
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é grep
y 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.sh
no 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.