Je peux trouver l'emplacement d'une définition de fonction , mais cela ne fonctionne pas pour les alias:
$ type -a subl
subl is an alias for /Applications/Sublime\ Text\ 2.app/Contents/SharedSupport/bin/subl
subl is /Users/brandon/bin/subl
Je veux savoir où cet alias est défini , pas ce qu'il est défini comme , ou là où il pointe . En d’autres termes: si je souhaite le modifier, quel est le numéro de fichier et de ligne à utiliser. J'ai effectué une recherche dans mon .zshrc
répertoire et dans les répertoires dans lesquels je conserve les fichiers qu'il contient et je ne trouve rien 1 . Comment puis-je le trouver sans avoir à chercher manuellement?
1. Je l'ai finalement trouvé en courant zsh -v
et en recherchant subl
, puis en lisant jusqu'à trouver une ligne commençant par source
. Néanmoins, j'aimerais un moyen non manuel de le faire à l'avenir.
Réponses:
Solution
Cela devrait faire l'affaire:
Cela devrait imprimer quelque chose comme
Cela signifie que dans le fichier
/Users/brandon/.zshrc.d/aliases.zsh
(juste par exemple), à la ligne 32, la commande aalias '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éfautPS4
, 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 laXTRACE
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ètresPS4
ouPROMPT4
.zsh
commence zsh-i
)XTRACE
activé (-x
)-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 pour2>&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 êtrealias subl="..."
due à l'analyse syntaxique. (Sous zsh, vous pouvez même définir un alias sans utiliser laalias
commande en attribuant des paires clé-valeur dans le tableau assoziatif )aliases
:aliases[subl]="..."
la source
alias
, juste au cas où le nom de l'alias serait utilisé dans un autre contexte.