Comment lister les fonctions définies dans mon shell?

222

Je peux taper alias pour afficher une liste de tous les alias.

Mais pour les fonctions, tout ce que je peux faire, c'est grep my .bash_profile.

Cela n'obtient que ceux de ce fichier, pas ceux définis dans les fichiers subsidiaires ou dynamiquement.

Existe-t-il un moyen plus pratique de savoir quelles fonctions sont actuellement définies?

Dov
la source
Copie possible de la liste des noms de fonctions dans un script shell
Alastair Irvine
2
@AlastairIrvine Merci pour la candidature en double; cependant, je l'ai résolu dans l'autre sens. Cette question a beaucoup plus de vues et de votes positifs, ainsi qu'une plus large sélection de réponses; et la réponse acceptée sur votre duplicata désigné est décidément obscure et sans doute tout simplement fausse.
tripleee

Réponses:

272

declare -F

Les noms et définitions de fonction peuvent être répertoriés avec l' -foption de la declarecommande intégrée (voir Bash Builtins). L' -Foption to declare listera uniquement les noms des fonctions (et éventuellement le fichier source et le numéro de ligne).

Manuel de référence Bash

L'Archétype Paul
la source
1
dans GNU bash 4.3.46 (1) -release (x86_64-pc-linux-gnu) -F répertorie les noms / -f répertorie toute la fonction
ceph3us
5
Pour obtenir le fichier source / ligne # "facultatif", il semble que vous devez activer extdebug ( shopt -s extdebug) ET fournir un ou plusieurs noms de fonction à la declare -Fcommande. IOW, declare -Fne fournit pas de noms de fichiers / lignes # même lorsque extdebug est activé, ce qui n'est pas clair dans la documentation, ni particulièrement intuitif, IMO.
Ron Burk
Voir la réponse de @ user495470 ci-dessous pour une meilleure solution.
starbeamrainbowlabs
82

En supposant que shell bash:

typeset -f

listera les fonctions.

typeset -F

affichera uniquement les noms des fonctions.

Randall Bohn
la source
8
Ma version bash v4.1.17 (9) dit:Obsolete. See `help declare'.
kevinarpe
5
C'est quand même bien de savoir que c'est un synonyme.
bmacnaughton
62
declare -F

vous donnera les noms de toutes les fonctions

type function_name

vous donnera la source d'une fonction particulière

John Lawrence Aspden
la source
2
Ou utilisez simplement declare -f (minuscule) pour la source
Katastic Voyage
51

declare -F imprime en fait des commandes de déclaration et pas seulement des noms de fonction:

$ declare -F
declare -f function1
declare -f function2

Vous pouvez utiliser compgen -A functionpour imprimer uniquement les noms de fonction:

$ compgen -A function
function1
function2
Lri
la source
6
compgen -A functionétait exactement ce que je cherchais.
2
Agréable! Je voulais aussi des alias dans mon cas ... vous pouvez obtenir à la fois des alias et des fonctions aveccompgen -a -A function
Matt Byrne
+1 et j'ai utilisé ce qui suit pour sortir mes fonctions personnelles uniquement (sur Linux Debian):compgen -A function | grep "^[a-z]\+" | grep -vE "^dequote|^quote|^in_array"
Dmytro Dzyubak
30

la composition est obsolète, veuillez utiliser:

declare -f

ou

declare -f function_name

ou

type function_name
Robert
la source
4
set | grep " ()"

Au lieu de grep, vous pouvez également utiliser fgrep ou hgrep (hgrep est mon préféré, c'est grep mais il met en évidence le résultat 'grep-ped'.

hgrep peut être trouvé ici: ACME Labs hgrep

AtomicKobold
la source
1
Cela
listera les
2
@AloisMahdal Voici un qui fonctionne: set | grep " () $" | cut -d' ' -f1. Mais c'est trop compliqué par rapport aux autres réponses.
wjandrea
5
grepn'est pas une bonne solution pour cela, les chaînes qui correspondent aux définitions de fonction provoqueront des faux positifs. @wjandrea peut toujours être capturé par des chaînes multi-lignes, comme tout regex.
Matt
1

Je ne suis pas un expert en la matière, j'apprends encore, mais après avoir trouvé cette question et sa réponse parce que je voulais la même chose, j'ai écrit ce qui suit (basé sur la réponse " The Archetypal Paul's declare ") pour me donner finalement ce que je cherchais : une liste formatée des alias et des fonctions:

function functionaliaslist() {
    echo
    echo -e "\033[1;4;32m""Functions:""\033[0;34m"
    declare -F | awk {'print $3'}
    echo
    echo -e "\033[1;4;32m""Aliases:""\033[0;34m"
    alias | awk {'print $2'} | awk -F= {'print $1'}
    echo
    echo -e "\033[0m"
}

C'était avant d'avoir vu la réponse de Lri , et donc en extrapolant à partir de cela, je remplace les lignes declareet aliaspar des compgencommandes appropriées , pour obtenir:

function functionaliaslist() {
    echo
    echo -e "\033[1;4;32m""Functions:""\033[0;34m"
    compgen -A function
    echo
    echo -e "\033[1;4;32m""Aliases:""\033[0;34m"
    compgen -A alias
    echo
    echo -e "\033[0m"
}

Woks un régal pour ce que je voulais. Partager au cas où cela aiderait quelqu'un d'autre.

Il existe une multitude d'autres "actions" disponibles compgen -A [action](et d'autres options pour compgenbien sûr). J'ai trouvé un bon article ici qui comprend également un lien vers la page de manuel (car man compgencela ne fonctionne pas dans certains cas).

DavidT
la source