Il existe de nombreuses fonctions qui peuvent être utilisées dans le shell Bash. Leurs définitions peuvent être répertoriées par set
, mais comment trouver dans quels fichiers certaines fonctions définies par l'utilisateur sont définies?
28
Réponses:
Activez le débogage. Du manuel Bash :
Exemple:
Et en effet:
la source
shopt -s extdebug; declare -Ff quote; shopt -u extdebug
.find_function()( shopt -s extdebug; declare -F "$@"; )
. Avec les parens sur le corps de la fonction, il est exécuté dans un sous-shell et le changement de shopts n'affecte pas l'appelant. Et-f
cela ne semble pas nécessaire.C'est en fait plus compliqué qu'il n'y paraît au premier abord. Les fichiers lus par votre shell dépendent du type de shell que vous utilisez actuellement. Qu'il soit interactif ou non, qu'il s'agisse d'un shell de connexion ou non, et quelle combinaison des éléments ci-dessus. Pour rechercher dans tous les fichiers par défaut qui peuvent être lus par les différents shells, vous pouvez faire (changer
$functionName
le nom réel de la fonction que vous recherchez):Si cela ne fonctionne pas, vous appelez peut-être un fichier non par défaut à l'aide de
.
ou de son aliassource
. Pour rechercher de tels cas, exécutez:Cela nécessite probablement quelques explications. Le
-P
permet Perl Compatible Regular Expressions (PCRE) qui nous permet d'utiliser une syntaxe regex plus sophistiquée. Plus précisément:(^|\s)
: correspond au début d'une ligne (^
) ou d'un espace (\s
).(\.|source)\s+
: correspond soit à un.
caractère littéral (\.
) soit au motsource
, mais uniquement s'ils sont suivis par un ou plusieurs espaces.Voici ce que cela me donne sur mon système:
Comme vous pouvez le voir, cependant, cela imprimera toute la ligne correspondante. Ce qui nous intéresse vraiment, c'est la liste des noms de fichiers appelés, pas la ligne qui les appelle. Vous pouvez les obtenir avec ce regex plus compliqué:
L'
-h
indicateur supprime l'impression des noms de fichiers où une correspondance a été trouvée, ce qui estgrep
fait par défaut lorsqu'on lui demande de rechercher dans plusieurs fichiers. Le-o
moyen "n'imprime que la partie correspondante de la ligne". Les éléments supplémentaires ajoutés à l'expression régulière sont les suivants:\K
: ignorer tout ce qui correspond à ce point. Il s'agit d'une astuce PCRE qui vous permet d'utiliser une expression rationnelle complexe pour trouver votre correspondance, mais pas d'inclure cette partie correspondante lors de l'utilisation du-o
drapeau de grep .Sur mon système, la commande ci-dessus renverra:
Notez que j'ai une utilisation de
.
suivie d'un espace qui n'est pas utilisé pour le sourcing mais c'est parce que j'ai un alias qui appelle une autre langue, pas bash. C'est ce qui donne l'étrange$a*100/$c
et")\n"'
dans la sortie ci-dessus. Mais cela peut être ignoré.Enfin, voici comment rassembler tout cela et rechercher un nom de fonction dans tous les fichiers par défaut et tous les fichiers que vos fichiers par défaut proviennent:
Ajoutez ces lignes à votre
~/.bashrc
et vous pouvez ensuite exécuter (j'utilisefooBar
comme exemple de nom de fonction):Par exemple, si j'ai cette ligne dans mon
~/.bashrc
:Et le fichier
~/a
est:Je devrais le trouver avec:
la source
+=
array+="foo"
ajout de la chaînefoo
au 1er élément du tableau?Le fichier dotfile habituel par utilisateur
bash
est~/.bashrc
. Cependant, il peut très bien source d'autres fichiers, j'aime par exemple garder les alias et les fonctions dans des fichiers séparés appelés~/.bash_aliases
et~/.bash_functions
, ce qui facilite leur recherche. Vous pouvez rechercher.bashrc
dessource
commandes avec:Une fois que vous avez la liste des fichiers créés par l'utilisateur, vous pouvez les rechercher ainsi que l'utilisateur
.bashrc
avec un seulgrep
appel, par exemple pour la fonctionfoo
pour ma configuration:la source