Solution
Cela devrait faire l'affaire:
PS4='+%x:%I>' zsh -i -x -c '' |& grep subl
Cela devrait imprimer quelque chose comme
+/Users/brandon/.zshrc.d/aliases.zsh:32>alias 'subl=/Applications/Sublime\ Text\ 2.app/Contents/SharedSupport/bin/subl'
Cela signifie que dans le fichier /Users/brandon/.zshrc.d/aliases.zsh
(juste par exemple), à la ligne 32, la commande a alias 'subl=/Applications/Sublime\ Text\ 2.app/Contents/SharedSupport/bin/subl'
été exécutée. Notez que la ligne de commande affichée est le résultat de l'analyse de la commande écrite dans le fichier. En tant que telles, elles peuvent ne pas être identiques.
Explication
La configuration de zsh est essentiellement une liste de commandes shell. Les informations à partir desquelles une commande a été exécutée sont généralement disponibles uniquement au moment de l'exécution de la commande. Une fois la commande terminée, les modifications de l'environnement ou des paramètres du shell peuvent rester, mais les informations sur la manière dont ces modifications ont été apportées ont disparu. Donc, la recherche dans les fichiers de configuration ou le suivi des informations pendant l'exécution sont les seules options.
Comme vous l'avez remarqué, la recherche dans les fichiers de configuration est sujette aux erreurs, car il est facile d'oublier certains fichiers de configuration. zsh charge directement jusqu'à huit fichiers de configuration différents lors du démarrage d'un shell interactif et un nombre quelconque de fichiers supplémentaires peut provenir de celui-ci.
C'est là que zsh's XTRACE
( -x
) entre en jeu. Semblable à VERBOSE
( -v
) XTRACE
affiche les lignes de commande exécutées, mais il précède également chaque ligne avec l' PS4
invite. PS4
peut être configuré pour afficher le fichier et le numéro de ligne en cours d'exécution. (Par défaut PS4
, le nom de la fonction ou du fichier de script est affiché, ainsi que le numéro de la ligne en cours d'exécution. Ainsi, si une ligne de code se trouvait dans une fonction, elle ne montrerait pas immédiatement où elle était définie.).
En détail, la commande ci-dessus a les effets suivants:
Définissez la variable d'environnement PS4
sur +%x:%I>
(pour cette commande uniquement). %x
est remplacé par le nom du fichier contenant le code source en cours d’exécution. %I
est le numéro de ligne de ce code dans le fichier. +
et >
sont décoratifs pour différencier la XTRACE
sortie de toute sortie que le script pourrait générer.
Remarque: Cela risque de ne pas fonctionner correctement si sa valeur PS4
est différente quelque part dans la configuration. Si le format de sortie ne correspond pas au format souhaité, il peut être nécessaire de supprimer / mettre en commentaire les paramètres PS4
ou PROMPT4
.
zsh
commence zsh
- avec mode interactif activé (
-i
)
- avec
XTRACE
activé ( -x
)
- et lance simplement une ligne de commande vide (
-c ''
), en sortant immédiatement par la suite.
Cela signifie que seuls les fichiers d’initialisation pour le mode interactif sont exécutés et que les commandes de génération d’invites ou de hook ne sont pas encombrées.
|&
est un raccourci pour 2>&1 |
, qui relie la sortie standard et l' erreur standard d'une commande à l' entrée standard de la suivante.
grep subl
recherche "subl". Je suggère de rechercher uniquement le nom de l'alias, car la ligne de commande exacte pourrait ne pas être alias subl="..."
due à l'analyse syntaxique. (Sous zsh, vous pouvez même définir un alias sans utiliser la alias
commande en attribuant des paires clé-valeur dans le tableau assoziatif ) aliases
:aliases[subl]="..."