Erhalte eine Liste von Funktionsnamen in einem Shell-Skript

7

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%     
n-alexander 13.04.2010, 15:23
quelle

4 Antworten

9

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%     
Hai Vu 15.04.2010, 00:14
quelle
10

typeset -f gibt die Funktionen mit ihren Körpern zurück, also wird ein einfaches awk-Skript verwendet, um die Funktionsnamen

herauszupicken %Vor%

Dieses Skript gibt Folgendes aus:

%Vor%     
glenn jackman 03.05.2011 10:39
quelle
3
  

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:

%Vor%     
user735796 03.05.2011 08:54
quelle
1

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.

    
Tim Post 13.04.2010 15:32
quelle

Tags und Links