Trouver l'emplacement d'une définition d'alias

4

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 .zshrcré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 -vet 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.

iconoclaste
la source
En relation étroite: comment trouver un fichier définissant un alias .
Dan Dascalescu

Réponses:

7

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) XTRACEaffiche les lignes de commande exécutées, mais il précède également chaque ligne avec l' PS4invite. PS4peut ê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 PS4sur +%x:%I>(pour cette commande uniquement). %xest remplacé par le nom du fichier contenant le code source en cours d’exécution. %Iest le numéro de ligne de ce code dans le fichier. +et >sont décoratifs pour différencier la XTRACEsortie de toute sortie que le script pourrait générer.

    Remarque: Cela risque de ne pas fonctionner correctement si sa valeur PS4est 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 PS4ou PROMPT4.

  • zshcommence zsh

    • avec mode interactif activé ( -i)
    • avec XTRACEactivé ( -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 sublrecherche "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 aliascommande en attribuant des paires clé-valeur dans le tableau assoziatif ) aliases:aliases[subl]="..."
Adaephon
la source
Je fais aussi de la recherche alias, juste au cas où le nom de l'alias serait utilisé dans un autre contexte.
iconoclast
cette réponse mérite bien le titre de "superutilisateur", merci!
lacostenycoder le