265 votes

Comment lister les fonctions définies dans mon shell ?

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 mon .bash_profile .

Cela ne récupère que ceux qui se trouvent dans ce fichier, et non ceux qui sont définis dans des fichiers subsidiaires ou dynamiquement.

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

4 votes

@AlastairIrvine Merci pour la nomination du doublon ; cependant, je l'ai résolu dans l'autre sens. Cette question a beaucoup plus de vues et de votes positifs, ainsi qu'une sélection plus large de réponses ; et la réponse acceptée sur votre doublon nommé est décidément obscure et sans doute simplement fausse.

6voto

AtomicKobold Points 79
set | grep " ()"

A la place de grep vous pouvez également utiliser fgrep o hgrep (hgrep est mon préféré, c'est grep mais il minimise le résultat de 'grep-ped'.

hgrep peuvent être trouvés ici : ACME Labs hgrep

4voto

DavidT Points 27

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 déclaration de l'archétype de Paul ") pour me donner finalement ce que je cherchais : une liste formatée d'alias et de 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 que je voie La réponse de Lri et donc, en extrapolant, je remplace l'élément declare y alias des lignes avec des compgen des commandes à la place, 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"
}

Ça marche très bien pour ce que je voulais. Je partage au cas où cela aiderait quelqu'un d'autre.

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

1voto

Richard Bronosky Points 3163

Réponse spécifique au shell Bash script.

(parce que cette question a été marqué comme un doublon de celui-ci)

Si vous avez des fonctions exportées dans votre shell, un script appelé les verra. Mais heureusement, elles sont marquées comme telles.

Démonstration de Copy-Pasta script

#!/bin/bash
foo(){ :;}; bar(){ :;}; baz(){ :;}; export -f foo bar

export -pf

bash -c $'spam(){ :;}; \
echo "RAW:"; \
declare -pF; \
echo "FILTERED:"; \
declare -pF | awk \'$2 !~ /x/{print$3}\''

Transcription en Bash

/tmp $ foo(){ :;}; bar(){ :;}; baz(){ :;}; export -f foo bar

/tmp $ export -pf
bar ()
{
    :
}
declare -fx bar
foo ()
{
    :
}
declare -fx foo

/tmp $ bash -c $'spam(){ :;}; echo "RAW:"; declare -pF; echo "FILTERED:"; declare -pF | awk \'$2 !~ /x/{print$3}\''
RAW:
declare -fx bar
declare -fx foo
declare -f spam
FILTERED:
spam

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X