GNU/Linux >> Tutoriels Linux >  >> Linux

Obtenir une liste de noms de fonctions dans un script shell

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.


Linux
  1. Comment utiliser les fonctions du shell de ligne de commande sous Linux

  2. Obtenir l'utilisation du processeur dans le script shell ?

  3. Répertoire courant du script shell ?

  4. Comment obtenir le PID d'un processus enfant forké dans un script shell

  5. Obtenir une ligne spécifique à partir d'un fichier texte en utilisant uniquement un script shell

Fonctions bash

Shell Scripting Partie V :Fonctions dans Bash

Comment obtenir l'adresse IP externe dans un script shell ?

Comment obtenir la propre adresse IP et l'enregistrer dans une variable dans un script shell ?

Tutoriel sur les fonctions Bash Shell avec 6 exemples pratiques

Comment puis-je obtenir mon adresse IP externe dans un script shell ?