Trouver la définition d'une fonction bash

41

Je travaille dans un environnement où règne une magie de scripts shell héritée. Une chose très utilisée en ligne de commande concerne les fonctions bash qui proviennent d’un fichier inclus dans un fichier inclus dans un fichier ... inclus dans mon fichier .bash_profile. Existe-t-il un moyen d’obtenir la définition ou même mieux l’emplacement de la définition de ces fonctions sans les localiser à travers 5 niveaux d’inclusions?

métaphore pythonique
la source

Réponses:

39

Pour obtenir la définition de la fonction:

type -a function_name
En pause jusqu'à nouvel ordre.
la source
@iconoclast: Oui.
pause jusqu'à nouvel ordre.
Si tu es un jour à Grand Rapids, je t'en achèterai un en personne ... sinon nous pouvons trouver un autre moyen ...
iconoclast
whence -f function_namedanszsh
dezza
66

En supposant que vous ayez une fonction nommée foo, les commandes ci-dessous obtiendront l’emplacement de la définition de la fonction, c’est-à-dire le nom du fichier dans lequel la fonction est définie, ainsi que le numéro de ligne sur lequel la fonction est définie dans ce fichier. .

# Turn on extended shell debugging
shopt -s extdebug

# Dump the function's name, line number and fully qualified source file  
declare -F foo

# Turn off extended shell debugging
shopt -u extdebug

Dans mon cas, le résultat de ces commandes est:

foo 32 /source/private/main/developer/cue.pub.sh
Les poils du chien
la source
3
Parfait. Je viens d'en faire une fonction bash dans mon fichier bashrc. whereisfunc() {shopt -s extdebug;declare -F $1;shopt -u extdebug}
Neil
5
@Neil: C'est pratique, merci: laissez-moi vous suggérer d'utiliser un sous-shell pour localiser l'effet de shoptsans changer l'état du shell actuel: whichfunc () ( shopt -s extdebug; declare -F "$1"; )(notez l'utilisation de (...)au lieu de {...}).
mklement0
Pourquoi ces commandes ne fonctionnent pas à partir d'un script? la fonction fonctionne correctement
albfan
1
Cela devrait être la réponse acceptée.
dissous
11

Pour voir la définition de la fonction (par opposition à son origine), utilisez:

declare -f <functionname>
Joshua Goldberg
la source
Je pense que celui-ci est meilleur que type -aparce qu'il n'imprime pas la première ligne dépendante des paramètres régionaux
ennuyés
1
mais comme il n'y a pas de lieu donné, ceci est une réponse à une question non posée - du moins non demandée ici
iconoclaste le
6

bash -xaffichera ce que bash exécute au démarrage, ce qui devrait vous permettre de le suivre plus facilement. N'oubliez pas de quitter le shell récemment ouvert.

Ignacio Vazquez-Abrams
la source
Trucs pratiques; pour capturer la trace dans un fichier, utilisez script out.txt bash -x(encore une fois, n'oubliez pas de exit).
mklement0
-2

d'une autre manière, que je trouve encore plus simple ces derniers temps:

  which <functionname>

(cela montrera également s'il s'agit d'un alias ou d'un script, mais ne localisera pas la source d'un alias)

Joshua Goldberg
la source
2
Je ne pense pas que whichdonne des informations sur les alias sur BSD ou mac. En outre, cette question concerne les fonctions et whichne donne pas d'informations sur les fonctions.
dbn
Merci pour cette note. Je vois maintenant que "qui" ne résout que les fonctions dans zsh, pas bash.
Joshua Goldberg
2
Je pense que cette réponse est susceptible d’inviter les votes négatifs ... elle ne semble pas répondre à la question du tout, car il n’ya pas d’information sur l’emplacement.
iconoclast
J'ai trouvé utile, dans le but de retrouver la déclaration, de l'utiliser et de déterminer s'il s'agissait d'un alias ou d'une fonction et de connaître la syntaxe avec laquelle il a été déclaré. Il est vrai que seule la réponse de @ HairOfTheDog donne directement le fichier.
Joshua Goldberg