web-dev-qa-db-fra.com

Est-il possible de vérifier où un alias a été défini?

Un alias, tel que ll est défini avec la commande alias.

Je peux vérifier la commande avec des choses comme type ll qui imprime

ll is aliased to `ls -l --color=auto'

ou command -v ll qui imprime

alias ll='ls -l --color=auto'

ou alias ll qui imprime aussi

alias ll='ls -l --color=auto'

mais je ne peux pas sembler trouver l'alias a été défini, c'est-à-dire un fichier tel que .bashrc, ou peut-être manuellement dans la coquille courante. À ce stade, je ne suis pas sûr que cela soit encore possible.

Devrais-je simplement passer à travers tous les fichiers chargés de bash et vérifiez chacun d'entre eux?

28
polemon

La définition manuelle sera difficile à repérer (les journaux d'historique, peut-être) mais demander à la coquille de montrer ce qu'il fait, puis grep devrait aider à trouver ceux-ci dans un fichier RC:

bash -ixlc : 2>&1 | grep ...
zsh -ixc : 2>&1 | grep ...

Si la coque ne captive pas avec précision les options nécessaires avec l'une des invocations ci-dessus (qui exécutent de manière interactive la commande NULL), alors script:

script somethingtogrep thatstrangeshell -x
...
grep ... somethingtogrep

Une autre option serait d'utiliser quelque chose comme strace ou sysdig _ à trouver tous Les fichiers touchent, puis allez grep ceux manuellement (pratiques si La coquille ou le programme n'a pas de -x drapeau); Les fichiers RC standard ne sont pas suffisants pour un chèque de nom de fichier manuel si quelque chose comme des configurations OH-My-My-ZSH ou Site-SPO-SIGE se tient à partir de qui sait où (ou également des variables d'environnement, comme le souligne Sorontar dans leur réponse) .

26
thrig

Voici où je trouve grep -rl très utile:

grep -rl alias ~/.bash* ~/.profile /etc/profile /etc/bash.bashrc

vous dira dans quel fichier le mot alias est utilisé.

Probablement dans ~/.bashrc et très certainement dans ~/.bash_aliases s'il existe.


Il est toutefois impossible d'être absolument sûr que cela couvre toutes les options. Ces fichiers peuvent également appeler ou charger tout autre fichier. Une variable d'environnement comme env ou $BASH_ENV peut diriger Bash pour charger d'autres fichiers.

recherche la variable Bash_env dans l'environnement, élargit sa valeur s'il l'apparaît et utilise la valeur étendue comme nom d'un fichier à lire et à exécuter.

Et des alias peuvent même être définis en définissant une variable (emphase mine):

Bash_aliases
[.____] une variable de matrice associative dont les membres correspondent à la liste interne des alias comme maintenus par l'alias intégré. Les éléments ajoutés à ce tableau apparaissent dans la liste d'alias

7
Isaac

Je ne connais pas un moyen de répertorier la source de vos alias, mais comme il semble que vous utilisiez Bash, je pense que ce sont les fichiers source possibles:

/etc/profile
~/.profile
/etc/bash.bashrc
~/.bash_profile
~/.bashrc

Vous devriez être capable de grep à travers ceux de trouver l'alias, par ex. grep 'ls -l --color=auto' /etc/profile ~/.profile /etc/bash.bashrc ~/.bash_profile ~/.bashrc.

2
edaemon

Combinaison Réponse de Thrig avec Suggestion de @ MarkPlotnick , vous pouvez vérifier si BASH_ALIASES[ll] est défini pour la réduire. Les BASH_SOURCE Array et LINENO variables sont particulièrement utiles ici. Malheureusement, le chèque si BASH_ALIASES[ll] est défini ne réussira que après l'alias a été défini, et la première ligne de ce type pourrait donc être dans un autre fichier.

PS4='${BASH_ALIASES["ll"]+"The ll alias has been defined before"} ${BASH_SOURCE}:$LINENO ' bash -lixc : |&
  grep 'll alias' -m1 -B1

Donner une sortie comme:

   /home/muru/.bash_aliases:1 alias 'll=ls -AlhF'
TThe ll alias has been defined before /home/muru/.bashrc:116 alias 'ping=ping -c5'

Vous pouvez même mettre fin à la coquille en utilisant ce chèque:

$ PS4='${BASH_ALIASES["ll"]+"$(kill -9 $$)"} ${BASH_SOURCE}:$LINENO ' bash -lixc : |& tail -n1
   /home/muru/.bash_aliases:1 alias 'll=ls -AlhF'
1
muru