Ich optimiere Debian-Init-Skripte manuell, um die Startzeit eines eingebetteten Geräts zu optimieren. Bisher habe ich sie mit den „leicht zu erreichenden Zielen“, also den kleineren Skripten, die leicht zu verstehen sind, um die Hälfte reduziert.
Jetzt habe ich noch ein paar Init-Skripte übrig, deren Ausführung insgesamt etwa 20 Sekunden dauert. Basierend auf den Erfahrungen mit den anderen Skripten kann ich hier weitere 5 bis 10 Sekunden gewinnen. Das Problem ist, dass diese Skripte für mich etwas zu schwer zu verstehen sind, da sie mehrere Hilfsskripte enthalten, die /lib/init/
schwer zu verstehen sind ( mount-functions.sh
was der Hauptgrund ist).
Um die verbleibenden Skripte verständlicher zu machen, damit ich sie optimieren kann, hätte ich gerne eine Möglichkeit, diese Init-Skripte „vorzuverarbeiten“, sodass jedes Mal, wenn sie eine Datei als Quelle verwenden, diese in das Skript selbst integriert wird (rekursiv natürlich), und die ungenutzten Funktionen zu entfernen, um den Code zu entrümpeln. Gibt es dafür ein Tool?
Antwort1
So etwas könntest du machen. Ich habe es nur oberflächlich getestet, aber ich denke, das Grundkonzept ist gut.
Beispiel
Angenommen, Sie haben das folgende Dateiverzeichnis:
$ 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
Die top.bash
Datei sieht folgendermaßen aus:
$ 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"
expander.bash
Sie können zum „Erweitern“ das folgende Skript verwenden 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
Beispielausführung
$ ./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"
Mögliche Verbesserungen?
Zum einen habe ich grep
und verwendet sed
. Diese könnten ausgetauscht werden, um eine reinere Bash-Lösung zu erhalten. Ich habe mir nicht die Zeit dafür genommen, da dies ein grober Prototyp ist.
Der zweite Bereich, der höchstwahrscheinlich Aufmerksamkeit erfordert, ist die Fähigkeit der Skripte, herauszufinden, dass eine andere Datei abgerufen wird. Das Muster, das dies erkennt, muss wahrscheinlich basierend auf Ihrer Situation „angepasst“ werden.
Antwort2
@slms Antwortinspirierte mich zum Schreibenflatten.sh.
flatten.sh
wird nicht die gesamte zu beziehende Datei einschließen. Stattdessen werden nur die in der Datei definierten Funktionen abgerufen, die tatsächlich im zu reduzierenden Skript verwendet werden.
Dies ist nützlich, wenn Sie eine Datei „lazy.lib“ behalten, die wiederum ALLE von Ihnen verwendeten Funktionen als Quelle enthält. Verwenden Sie „lazy.lib“ während der Entwicklung einfach als Quelle in Ihrem Skript und reduzieren Sie die Datei, wenn Sie fertig sind.