typeset -f
renvoie les fonctions avec leur corps, donc un simple script awk est utilisé pour extraire les noms des fonctions
f1 () { :; }
f2 () { :; }
f3 () { :; }
f4 () { :; }
help () {
echo "functions available:"
typeset -f | awk '/ \(\) $/ && !/^main / {print $1}'
}
main () { help; }
main
Ce script affiche :
functions available:
f1
f2
f3
f4
help
Vous appelez cette fonction sans arguments et elle crache une liste de noms de fonctions séparés par des "espaces blancs".
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.
}
Pour charger les fonctions dans un tableau :
declare MyVar=($(script.functions));
Bien sûr, le bon sens dicte que toutes les fonctions qui n'ont pas été sourcées dans le fichier courant avant que celui-ci ne soit appelé n'apparaîtront pas dans la liste.
Pour rendre la liste en lecture seule et disponible pour l'exportation vers d'autres scripts appelés par ce script :
declare -rx MyVar=($(script.functions));
Pour imprimer la liste entière en tant que saut de ligne séparé :
printf "%s\n" "${MyVar[@]}";
Vous pouvez obtenir une liste des fonctions de votre script en utilisant la commande grep sur votre propre script. Pour que cette approche fonctionne, vous devrez structurer vos fonctions d'une certaine manière afin que grep puisse les trouver. Voici un exemple :
$ 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
Voici une démo interactive :
$ 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
Si vous avez une fonction "privée" que vous ne souhaitez pas afficher dans l'aide, omettez la partie "fonction" :
my_private_function()
{
# Do something
}
La meilleure chose à faire est de créer un tableau (vous utilisez bash) qui contient les fonctions que vous souhaitez annoncer et que votre fonction d'aide parcourt et les imprime.
Appel set
seule produira les fonctions, mais dans leur intégralité. Vous auriez encore à analyser cette recherche de choses se terminant par () pour obtenir les symboles proverbiaux .
Il est aussi probablement plus sain d'utiliser quelque chose comme getopt
tourner --function-name
en function_name
avec argumentation. Mais bon, sain d'esprit c'est relatif et vous n'avez pas posté de code :)
Votre autre option est de créer un loadable pour bash (un fork de set
) qui accomplit cela. Honnêtement, je préférerais passer par l'analyse avant d'écrire un chargeable pour cette tâche.