Shell-Skripte vereinfachen (Quellskripte einschließen) und ungenutzte Funktionen entfernen

Shell-Skripte vereinfachen (Quellskripte einschließen) und ungenutzte Funktionen entfernen

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.shwas 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.bashDatei 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.bashSie 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 grepund 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.shwird 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.

verwandte Informationen