Ich habe ein Bourne-Shell-Skript, das mehrere Funktionen enthält und auf folgende Weise aufgerufen werden kann:
my.sh <func_name> <param1> <param2>
Inside func_name () wird mit param1 und param2 aufgerufen.
Ich möchte eine "Hilfe" -Funktion erstellen, die nur alle verfügbaren Funktionen auflistet, auch ohne Parameter.
Die Frage: Wie bekomme ich eine Liste aller Funktionsnamen in einem Skript aus dem Skript heraus?
Ich möchte vermeiden, es analysieren zu müssen und nach Funktionsmustern zu suchen. Zu leicht, falsch zu verstehen.
Danke, Alex
update: der Code. Wollte meine help () - Funktion wie main () sein - eine Funktion, die dem Code hinzugefügt wurde, wird automatisch zur Hilfe hinzugefügt.
%Vor%Sie können eine Liste von Funktionen in Ihrem Skript abrufen, indem Sie den Befehl grep für Ihr eigenes Skript verwenden. Damit dieser Ansatz funktioniert, müssen Sie Ihre Funktionen auf eine bestimmte Weise strukturieren, damit Grep sie finden kann. Hier ist ein Beispiel:
%Vor%Hier ist eine interaktive Demo:
%Vor%Wenn Sie eine "private" -Funktion haben, die nicht in der Hilfe angezeigt werden soll, dann lassen Sie den "function" -Teil weg:
%Vor% typeset -f
gibt die Funktionen mit ihren Körpern zurück, also wird ein einfaches awk-Skript verwendet, um die Funktionsnamen
Dieses Skript gibt Folgendes aus:
%Vor%%Vor%Sie rufen diese Funktion mit Nein auf Argumente und es spuckt aus "whitespace" getrennte Liste von nur Funktionsnamen.
%Vor%Um die Funktionen in ein Array zu laden:
%Vor%Natürlich diktiert der gesunde Menschenverstand das irgendwelche Funktionen, die nicht waren zuvor in die aktuelle Datei eingefügt Dieser Name wird nicht angezeigt Liste.
Um die Liste schreibgeschützt zu machen und verfügbar für den Export in andere Skripte aufgerufen von diesem Skript:
%Vor%Um die gesamte Liste als Zeilenumbruch zu drucken getrennt:
Am besten erstellen Sie ein Array (Sie verwenden bash), das Funktionen enthält, für die Sie werben möchten und bei denen die Hilfefunktion iteriert und gedruckt werden kann.
Wenn set
alleine aufgerufen wird, werden die Funktionen in ihrer Gesamtheit erzeugt. Sie müssten immer noch nach Dingen suchen, die auf () enden, um die sprichwörtlichen Symbole zu erhalten.
Es ist wahrscheinlich auch vernünftiger, etwas wie getopt
zu verwenden, um --function-name
in function_name
mit Argumenten umzuwandeln. Aber, nun, vernünftig ist relativ und du hast keinen Code gepostet:)
Ihre andere Option besteht darin, eine ladbare Datei für bash zu erstellen (eine Abzweigung von set
). ) das schafft das. Ehrlich, ich würde lieber mit Parsing gehen, bevor ich ein ladbares für diese Aufgabe schreibe.