typeset -f
gibt die Funktionen mit ihren Körpern zurück, also wird ein einfaches awk-Skript verwendet, um die Funktionsnamen auszulesen
f1 () { :; }
f2 () { :; }
f3 () { :; }
f4 () { :; }
help () {
echo "functions available:"
typeset -f | awk '/ \(\) $/ && !/^main / {print $1}'
}
main () { help; }
main
Dieses Skript gibt Folgendes aus:
functions available:
f1
f2
f3
f4
help
Sie rufen diese Funktion ohne Argumente auf und sie spuckt nur eine durch "Leerzeichen" getrennte Liste von Funktionsnamen aus.
function script.functions () {
local fncs=`declare -F -p | cut -d " " -f 3`; # Get function list
echo $fncs; # not quoted here to create shell "argument list" of funcs.
}
Um die Funktionen in ein Array zu laden:
declare MyVar=($(script.functions));
Natürlich diktiert der gesunde Menschenverstand, dass alle Funktionen, die nicht in die aktuelle Datei aufgenommen wurden, bevor diese aufgerufen wird, nicht in der Liste auftauchen.
So machen Sie die Liste schreibgeschützt und für den Export in andere Skripts verfügbar, die von diesem Skript aufgerufen werden:
declare -rx MyVar=($(script.functions));
So drucken Sie die gesamte Liste als durch Zeilenumbrüche getrennt:
printf "%s\n" "${MyVar[@]}";
Sie können eine Liste der Funktionen in Ihrem Skript abrufen, indem Sie den grep-Befehl in Ihrem eigenen 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:
$ cat my.sh
#!/bin/sh
function func1() # Short description
{
echo func1 parameters: $1 $2
}
function func2() # Short description
{
echo func2 parameters: $1 $2
}
function help() # Show a list of functions
{
grep "^function" $0
}
if [ "_$1" = "_" ]; then
help
else
"[email protected]"
fi
Hier ist eine interaktive Demo:
$ my.sh
function func1() # Short description
function func2() # Short description
function help() # Show a list of functions
$ my.sh help
function func1() # Short description
function func2() # Short description
function help() # Show a list of functions
$ my.sh func1 a b
func1 parameters: a b
$ my.sh func2 x y
func2 parameters: x y
Wenn Sie eine „private“ Funktion haben, die nicht in der Hilfe angezeigt werden soll, lassen Sie den Teil „Funktion“ weg:
my_private_function()
{
# Do something
}
Das Beste, was Sie tun können, ist, ein Array zu erstellen (Sie verwenden Bash), das Funktionen enthält, die Sie ankündigen möchten, und Ihre Hilfefunktion iterieren und sie drucken lassen.
Anruf set
allein erzeugt die Funktionen, aber in ihrer Gesamtheit. Sie müssten das immer noch analysieren, indem Sie nach Dingen suchen, die auf () enden, um die sprichwörtlichen Symbole zu erhalten .
Es ist wahrscheinlich auch vernünftiger, so etwas wie getopt
zu verwenden um --function-name
zu drehen in function_name
mit Argumenten. Aber gesund ist relativ und du hast keinen Code gepostet :)
Ihre andere Möglichkeit besteht darin, ein Loadable für Bash zu erstellen (ein Fork von set
), das dies bewirkt. Ehrlich gesagt würde ich es vorziehen, mit Parsing zu beginnen, bevor ich ein Loadable für diese Aufgabe schreibe.