Je ne peux pas comprendre comment trouver le fichier où une fonction bash est définie ( __git_ps1
dans mon cas).
J'ai expérimenté avec declare
, type
, which
mais rien ne me dit que le fichier source. J'ai lu quelque part qui declare
peut imprimer le nom du fichier et le numéro de ligne, mais il n'a pas été expliqué comment. La help
page pour declare
ne le dit pas non plus.
Comment puis-je obtenir ces informations?
$PATH
,type
cela ne fonctionnera pas. Vous pouvez essayer d'utiliser simplementfind
oulocate
.locate
sera beaucoup plus rapide, car il utilise une base de données préexistante, mais cela ne fonctionnera pas si la commande a été installée récemment.Réponses:
Si vous êtes prêt à exécuter la fonction, vous pouvez obtenir les informations en utilisant
set -x
pour tracer l'exécution et en définissant laPS4
variable.Démarrez bash avec
--debugger
ou sinon utilisezshopt -s extdebug
pour enregistrer des informations de débogage supplémentaires.Définissez
PS4
, l '«invite» imprimée lors du traçage pour afficher la ligne source.Activez le traçage.
vous pouvez ensuite exécuter votre fonction et pour chaque ligne, vous obtiendrez le nom de fichier de la fonction.
utiliser
set +x
pour désactiver le traçage.Donc, dans ce cas, vous courriez
la source
Si vous ne souhaitez pas exécuter la fonction, vous pouvez toujours configurer le débogage et obtenir les informations. Les étapes sont
bash --debugger
oushopt -s extdebug
avant que la fonction ne soit définie.declare -F __git_ps1
et il indiquera où la fonction est définie.
Les avantages de cette méthode par rapport à la visualisation de la trace d'exécution annotée avec PS4 sont les suivants:
Les avantages de la trace d'exécution sont
Je recommande fortement d' avoir
shopt -s extdebug
au début des deux~/.bashrc
et~/.bash_profile
de couvrir les différents fichiers utilisés dans différents cas d' invocation .la source
shopt -s extdebug
est appelé après la définition de la fonction. Méfiez-vous des numéros de ligne peut être désactivé (un bug actuel) si la fonction est déclarée à traverseval
.bash --debugger
je devais réellement déclencher l'achèvement pour obtenir la fonction d'achèvement définie et obtenir son rapportdeclare -F _vpnc
.~/.bash_profile
dans Xubuntu 18.04.shopt -s extdebug
défini la valeur par défaut?La grande solution de @ icarus fonctionne pour les fonctions, tant qu'elles sont définies littéralement et non pas le résultat d'un
eval
du contenu d'un autre fichier (dans lequel le fichier avec leeval
apparaîtra comme source). Il n'imprimera pas le fichier source des alias, des shell intégrés (commeecho
) et des exécutables (binaires ou non), et je pense que ces informations ne sont pas disponibles en général. Certaines commandes peuvent imprimer leurs fichiers source (et peuvent même être véridiques à ce sujet), soit au cours d'une exécution normale, soit en réponse à un signal.__git_ps1
est défini dans/usr/share/git/git-prompt.sh
et/usr/share/git/completion/git-prompt.sh
sur mon système, Arch Linux, il peut donc en être de même pour vous.Jetez un oeil à la section Invocation de
man bash
si vous voulez rechercher des commandes spécifiquement fournies au début du shell - elles peuvent source d'autres fichiers qui à leur tour source d'autres fichiers.la source
bash
?$HOME/.bashrc
et in$HOME/.profile
. Voir: linuxfromscratch.org/blfs/view/svn/postlfs/profile.html qui explique certains détails sur quand et comment chaque fichier est obtenu./etc/profile
,$HOME/.bash_profile
,$HOME/.bash_login
, Et le contenu$ENV
et$BASH_ENV
doivent être ajoutés à votre liste.Cela ne semble pas possible en
bash
, mais c'est enzsh
:la source
find
/locate
/grep
.~/.whatever
fichiers que bash par défaut, et ne donnera des réponses utiles que pour les fonctions définies dans des emplacements partagés comme dans ce cas, qui ne sont pas redéfinis dans~/.bashrc
ou autre.Déclarez une fonction du même nom et définissez-la en lecture seule le plus tôt possible, puis activez le mode xtrace, quelque chose comme:
Après cela, lorsque vous vous connecterez, vous verrez des informations de trace qui incluent le sourcing des fichiers. Au moment où il y a une tentative de déclaration de la fonction en lecture seule existante, vous verrez un message d'erreur. Le dernier fichier source avant il doit contenir la déclaration que vous recherchez.
Vous devrez peut-être mettre cela dans le profil bash du système. N'oubliez pas non plus de revenir sur les modifications après avoir trouvé le coupable.
la source
Avez-vous essayé cela?
ou l'une des autres commandes trouvées ici:
Comment trouver tous les fichiers contenant du texte spécifique sous Linux? | Débordement de pile
Il semble que je doive vous donner plus d'explications. Votre question demande "" Ainsi, si vous exécutez la commande suivante, elle devrait renvoyer tous les fichiers où une fonction bash est définie.
Programmation BASH - Fonctions | Projet de documentation Linux
la source