Puis-je obtenir toutes les fonctions dans un fichier de script, en utilisant bash?

0

Si j'ai un fichier:
dome.sh

$ls -l dome.sh
-rwxrwxr-x 1 user user 0 Aug  8 11:19 dome.sh

et le contenu du fichier est similaire à:

#!/bin/bash
function() {
    'work'
    }
another() {
    'different work'
    }
...
#30 functions later
yetANOTHERfunction () {
    'even more work'
    }

où "# 30 fonctions plus tard" signifie qu'il y a 30 fonctions supplémentaires uniques

Puis-je en quelque sorte parcourir toutes les fonctions de ce script pour les identifier?

quelque chose comme:

for i in $(get all functions in this file); do
    echo $i
done

produire:

function
another
...
yetANOTHERfunction
spezticle
la source

Réponses:

1

Si vous mettez le "F" en majuscule dans "declare -F", il retournera des lignes comme "declare -f functionName". Il ne vous reste plus qu'à couper la première partie de cette ligne. Voici le code:

#!/bin/bash
function () {
   return
}
another () {
   return
}
yetANOTHERfunction () {
   return
}
IFS=$'\n'
for f in $(declare -F); do
   echo "${f:11}"
done
bashBedlam
la source
Ou tout simplement pour tuyau cutcomme ceci: declare -F | cut -d ' ' -f3.
Toby Speight
0

Essayer:

get_fcn_list () {
    env -i bash --noprofile --norc -c '
    source "'"$1"'"
    typeset -f |
    grep '\''^[^{} ].* () $'\'' |
    awk "{print \$1}" |
    while read -r fcn_name; do
        type "$fcn_name" | head -n 1 | grep -q "is a function$" || continue
        echo "$fcn_name"
    done
'
}

for fcn_name in $(get_fcn_list dome.sh); do
    echo "$fcn_name"
done

Explication:

  • Plutôt que d’analyser vous-même les fonctions, laissez-les bashanalyser (avec source) et vider le contenu ( typeset -f).

  • L'invocation env -i bash --noprofile --norcest destinée à empêcher la bashlecture de fichiers d'initialisation. Sinon, vous pourriez obtenir des fonctions définies dans, par exemple, ~/.bashrc.

  • typeset -fva vider toutes les fonctions et leurs définitions. Chaque définition commence par: nom de la fonction , l' espace , (), l' espace , nouvelle ligne . grepet awkextraire les noms de fonction de ces lignes.

  • La raison du filtre est que vous pouvez obtenir des faux positifs lorsque vous avez des fonctions telles que:

    f () 
    { 
        echo "
    a () 
    "
    }

    Ici, la whileboucle serait imprimée par erreur a, mais le filtre s'en occupe.

  • Modifié pour imprimer des fonctions à partir d’un fichier et éviter d’inclure les fichiers de démarrage.

Matei David
la source
merci pour cette réponse. Il me faudra peut-être un jour ou deux pour revenir sur ce projet, mais je vais vérifier et le marquer comme la réponse.
Article
Pour simplifier les choses, vous pouvez appeler la commande intégrée declare -fsans aucun autre argument dans le script d’intérêt pour obtenir une liste des définitions de fonction qu’il contient . En d'autres termes, si vous avez ajouté la ligne declare -f au bas d'un script et que vous l'avez obtenue à partir d'un shell, les définitions de fonction, dans ce script uniquement, seront exportées vers le terminal. Il affiche le nom de la fonction ainsi que le corps. Ainsi, si vous voulez juste le nom, vous devrez diriger cette sortie via sed / grep. c'est-à-dire argument).
Argonautes
1) declareet typesetsont la même commande. 2) Toutes les fonctions de votre shell (pas nécessairement du fichier d’intérêt) apparaissent dans la sortie. C'est le deuxième point ci-dessus.
Matei David