Überprüfen Sie die Abhängigkeiten von Bash / Shell-Skripten


13

Gibt es eine Methode / einen Befehl, um die Abhängigkeiten eines Bash-Skripts zu überprüfen? Mit anderen Worten, eine Antwort auf diese Frage: Welche Bibliotheken sollte ein Benutzer installieren, um das Skript auszuführen?

Ich kann dies manuell tun, indem ich das Skript lese und überprüfe, welche anderen Bibliotheken / Befehle es aufruft, aber dies ist bei langen Skripten nicht ersichtlich.

Antworten:


8

Das unglaublich arkane Autoconf-System ist es gewohnt

Erstellen von Shell-Skripten zur automatischen Konfiguration von Software-Quellcode-Paketen. Diese Skripte können die Pakete ohne manuellen Benutzereingriff an viele Arten von UNIX-ähnlichen Systemen anpassen. Autoconf erstellt ein Konfigurationsskript für ein Paket aus einer Vorlagendatei, in der die Betriebssystemfunktionen aufgeführt sind, die das Paket in Form von M4-Makroaufrufen verwenden kann.

Wenn das nicht beängstigend genug ist, warten Sie, bis Sie versuchen, Ihr erstes Autoconf-Skript zu schreiben. Die Autoren von autoconf scheuen nicht die Schwierigkeit :

Diejenigen, die Autoconf nicht verstehen, sind verdammt, es schlecht neu zu erfinden. Das Hauptziel von Autoconf besteht darin, dem Benutzer das Leben zu erleichtern. Das Leben des Betreuers zu erleichtern, ist nur ein sekundäres Ziel. Anders ausgedrückt, das primäre Ziel ist es nicht, die Generierung von configure für Paketbetreuer automatisch zu machen. Vielmehr besteht das Ziel darin, die Konfiguration für den Endbenutzer jedes automatisch konfiszierten Pakets schmerzfrei, portabel und vorhersehbar zu machen. Insofern ist Autoconf bei seinem Ziel sehr erfolgreich - die meisten Beschwerden in der Autoconf-Liste beziehen sich auf Schwierigkeiten beim Schreiben von Autoconf-Eingaben und nicht auf das Verhalten der resultierenden Konfiguration.

Auf der anderen Seite werden Sie aus dem Prozess herauskommen und mehr über die fummeligen Teile verschiedener Systeme wissen, als Sie jemals für möglich gehalten hätten.

In diesen Tagen würde ich persönlich davon ausgehen, dass eine viel standardisiertere Debian-ish-Distribution mein Ziel war und mich nicht dazu zwingen würde, ein anderes Autoconf-Skript zu schreiben. Ich habe das Glück, den Luxus zu haben, das zu wählen; Möglicherweise haben Sie keinen solchen Spielraum.


3

Diese Aufgabe ist nicht einfach zu automatisieren, da ein Skript möglicherweise Konstrukte verwendet, die die statische Analyse umgehen. Wenn es jemals evalein Präfix wie timeoder verwendet nice, ist es nicht so einfach egrep -o '^[^ ]+ ? ', Befehle abzurufen und sie durch whichoder auszuführen type.

Am Ende ist die einzige Möglichkeit, absolut sicher zu sein, das Skript auszuführen und herauszufinden, was fehlschlägt. Wenn ein Skript gut geschrieben ist, sucht es vor der Ausführung nach Befehlen, die nicht dem Standard entsprechen. Wenn nicht, ist Versuch und Irrtum der einzige Weg, um sicher zu sein.

Trotzdem könnte so etwas helfen:

#!/bin/bash
egrep -o -e '^[^ ]+ ? ' -e '[a-zA-Z0-9]+' "$1" | sort -u | {
    while read line
    do
        if type $line &>/dev/null
        then
            echo "$line found"
        else
            echo "Error: $line not found"
        fi
    done
} | sort

Die Ausgabe sieht folgendermaßen aus:

$ ./check i_wonder.sh
cd found
echo found
elif found
else found
Error: abort not found
Error: checkurl not found
Error: cleanup not found
Error: count not found
Error: debug not found
Error: deleteFile not found
Error: die not found
find found
for found
grep found
if found
mv found
readarray found
rm found
shopt found
size found
sleep found
stat found
trap found
unset found
while found
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.