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?
41
whence -f function_name
danszsh
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. .
Dans mon cas, le résultat de ces commandes est:
la source
whereisfunc() {shopt -s extdebug;declare -F $1;shopt -u extdebug}
shopt
sans changer l'état du shell actuel:whichfunc () ( shopt -s extdebug; declare -F "$1"; )
(notez l'utilisation de(...)
au lieu de{...}
).Pour voir la définition de la fonction (par opposition à son origine), utilisez:
la source
type -a
parce qu'il n'imprime pas la première ligne dépendante des paramètres régionauxbash -x
affichera 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.la source
script out.txt bash -x
(encore une fois, n'oubliez pas deexit
).d'une autre manière, que je trouve encore plus simple ces derniers temps:
(cela montrera également s'il s'agit d'un alias ou d'un script, mais ne localisera pas la source d'un alias)
la source
which
donne des informations sur les alias sur BSD ou mac. En outre, cette question concerne les fonctions etwhich
ne donne pas d'informations sur les fonctions.