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"

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'

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

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}


4
set | grep -A999 '^foobar ()' | grep -m1 -B999 '^}'

avec foobar étant le nom de la fonction.


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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.