typeset -f
restituisce le funzioni con i loro corpi, quindi viene utilizzato un semplice script awk per estrarre i nomi delle funzioni
f1 () { :; }
f2 () { :; }
f3 () { :; }
f4 () { :; }
help () {
echo "functions available:"
typeset -f | awk '/ \(\) $/ && !/^main / {print $1}'
}
main () { help; }
main
Questo script restituisce:
functions available:
f1
f2
f3
f4
help
Chiami questa funzione senza argomenti e genera solo un elenco di nomi di funzioni separati da "spazi bianchi".
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.
}
Per caricare le funzioni in un array:
declare MyVar=($(script.functions));
Naturalmente, il buon senso impone che tutte le funzioni che non sono state inserite nel file corrente prima che questo venga chiamato non verranno visualizzate nell'elenco.
Per rendere l'elenco di sola lettura e disponibile per l'esportazione in altri script richiamati da questo script:
declare -rx MyVar=($(script.functions));
Per stampare l'intero elenco come separato da una nuova riga:
printf "%s\n" "${MyVar[@]}";
Puoi ottenere un elenco di funzioni nel tuo script usando il comando grep sul tuo script. Affinché questo approccio funzioni, dovrai strutturare le tue funzioni in un certo modo in modo che grep possa trovarle. Ecco un esempio:
$ 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
Ecco una demo interattiva:
$ 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
Se hai una funzione "privata" che non vuoi mostrare nella guida, ometti la parte "funzione":
my_private_function()
{
# Do something
}
La cosa migliore da fare è creare un array (stai usando bash) che contenga le funzioni che vuoi pubblicizzare e che la tua funzione help le ripeta e le stampi.
Chiamando set
da solo produrrà le funzioni, ma nella loro totalità. Dovresti comunque analizzare la ricerca di cose che finiscono in () per ottenere i proverbiali simboli .
Probabilmente è anche più sensato usare qualcosa come getopt
per compiere --function-name
in function_name
con argomenti. Ma, beh, sensato è relativo e non hai postato il codice :)
L'altra opzione è creare un file caricabile per bash (un fork di set
) che realizza questo. Onestamente, preferirei procedere con l'analisi prima di scrivere un caricabile per questo compito.