Bash peut-il afficher la définition d'une fonction?

262

Existe-t-il un moyen d'afficher la définition d'une fonction bash dans bash?

Par exemple, disons que j'ai défini la fonction foobar

function foobar {
    echo "I'm foobar"
}

Existe-t-il un moyen d'obtenir ultérieurement le code qui foobars'exécute?

$ # non-working pseudocode
$ echo $foobar
echo "I'm foobar"
k107
la source

Réponses:

357

Utilisez type. Si foobarest par exemple défini dans votre ~/.profile:

$ type foobar
foobar is a function
foobar {
    echo "I'm foobar"
}

Cela permet de découvrir ce qui foobarétait, et s'il était défini comme une fonction qu'il appelle declare -fcomme expliqué par pmohandras.

Pour imprimer uniquement le corps de la fonction (c'est-à-dire le code), utilisez sed:

type foobar | sed '1,3d;$d'
Benjamin Bannier
la source
2
@sjsupersumit La question demande explicitement une solution Bash.
bfontaine
210

Vous pouvez afficher la définition d'une fonction en bash en utilisant declare. Par exemple:

declare -f foobar
pmohandas
la source
1
Génial, au point, fonctionne même lorsque les fonctions sont définies dans d'autres fichiers de script chargés. Fonctionne également dans zsh.
Diego Nemo
2
Fonctionne avec d'anciens shells sur des systèmes non-linux si vous utiliseztypeset -f
Emmanuel
bon aussi qu'il montre juste la functiondéfinition, donc vous n'avez pas à analyser si c'est ce que vous voulez.
ribamar
5
set | sed -n '/^foobar ()/,/^}/p'

Cela imprime essentiellement les lignes de votre commande set commençant par le nom de la fonction foobar () et se terminant par}

Jurgen van der Mark
la source
4
set | grep -A999 '^foobar ()' | grep -m1 -B999 '^}'

avec foobar étant le nom de la fonction.

pyroscope
la source
4
problème: ne s'affichera que jusqu'au premier "}", ce qui n'est pas tout lorsque la définition contient des imbrications de "{...}", ce que Bash autorise en effet.
Destiny Architect
1
Peut également échouer si la fonction contient une chaîne here-doc / here-string contenant le motif d'accolade
Cheetah