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


24

Un alias, tel que lldéfini avec la aliascommande.

Je peux vérifier la commande avec des choses comme les type llimpressions

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

ou command -v llqui imprime

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

ou alias llqui imprime également

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

mais je n'arrive pas à trouver l'alias a été défini, c'est-à-dire un fichier tel que .bashrc, ou peut-être manuellement dans le shell en cours d'exécution. À ce stade, je ne sais pas si cela est même possible.

Dois-je simplement parcourir tous les fichiers qui sont chargés par bashet vérifier chacun d'eux?


Je vous dirais de courirbash -xl
Jeff Schaller

Réponses:


21

La définition manuelle sera difficile à repérer (les journaux d'historique, peut-être) bien que demander au shell de montrer ce qu'il fait et grepdevrait ensuite aider à trouver ceux définis dans un fichier rc:

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

Si le shell ne capture pas précisément les options nécessaires avec l'une des invocations ci-dessus (qui exécutent la commande null de manière interactive), alors script:

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

Une autre option serait d'utiliser quelque chose comme straceou sysdigde trouver tous les fichiers que le shell touche, puis de les passer grepmanuellement (pratique si le shell ou le programme n'a pas d' -xindicateur); les fichiers RC standard ne sont pas suffisants pour une vérification manuelle du nom de fichier si quelque chose comme oh-my-zsh ou des configurations spécifiques au site extrait du code de qui sait où (ou il peut également y avoir des variables d'environnement, comme le souligne sorontar dans sa réponse) .


Merci! Même si la sortie est un peu difficile à analyser, mais j'ai trouvé le fichier qui définissait l'alias que je cherchais. Lorsque l'alias n'est présent nulle part dans cette liste, serait-il sûr de supposer que l'alias a été défini manuellement?
polemon

@polemon quelque peu sûr; il pourrait être (ou avoir été) défini dans un fichier qui n'est pas lu à cause de qui-sait-quelle-raison-ou-a été supprimé (surtout s'il y a une sorte de structure de shell ajoutant de la complexité que l'utilisateur n'a pas comprendre).
thrig

1
Pour rendre le point où l'alias est défini un peu plus facile à trouver, vous pouvez utiliser la PS4, qui est ajoutée à chaque ligne d'une trace:PS4='+The ll alias is "${BASH_ALIASES["ll"]}" ' bash -ixlc :
Mark Plotnick

5

Voici où je trouve grep -rltrès utile:

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

vous indiquera dans quel fichier le mot aliasest utilisé.

Probablement dans ~/.bashrcet très certainement ~/.bash_aliasess'il existe.


Il est cependant 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_ENVpeut demander à bash de charger d'autres fichiers.

recherche la variable BASH_ENV dans l'environnement, développe sa valeur si elle y apparaît et utilise la valeur développée comme nom d'un fichier à lire et à exécuter.

Et les alias peuvent même être définis en définissant une variable (accent sur le mien):

BASH_ALIASES
Variable de tableau associatif dont les membres correspondent à la liste interne d'alias gérée par l'alias intégré. Les éléments ajoutés à ce tableau apparaissent dans la liste des alias


grep -rl alias ~/.bash*peut correspondre faussement aux fichiers d'historique, mais +1 pour avoir signalé le tableau BASH_ALIASES!
Jeff Schaller

2

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

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

Vous devriez pouvoir les parcourir pour trouver l'alias, par exemple grep 'ls -l --color=auto' /etc/profile ~/.profile /etc/bash.bashrc ~/.bash_profile ~/.bashrc.


Ou des fichiers inclus à partir de là ...
Jeff Schaller

@JeffSchaller - D'accord, vous auriez besoin de quelque chose de plus complexe pour cela bash -x, comme vous l'avez mentionné. J'ai pensé que ce qui précède était assez facile à exécuter rapidement et s'il ne trouve pas l'alias, vous pouvez lire les étapes d'exécution.
edaemon

1

En combinant la réponse de thrig avec la suggestion de @ MarkPlotnick , vous pouvez tester si elle BASH_ALIASES[ll]est définie pour la réduire. Le BASH_SOURCEtableau et les LINENOvariables sont particulièrement utiles ici. Malheureusement, la vérification de la BASH_ALIASES[ll]définition de ce paramètre ne réussira qu'après la définition de l'alias, de sorte que la première ligne de ce type pourrait se trouver 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 terminer le shell en utilisant cette vérification:

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

0

J'ai eu du succès en utilisant simplement which.

[crclayton@pc scripts]$ which foo
foo:     aliased to python $HOME/projects/python/foo.py

1
whichpeut gérer les alias dans tcsh (et peut-être plus tôt csh) et zsh où il est intégré, et dans bash en utilisant le profil par défaut sur la famille RedHat qui a un kludge pour exécuter le programme GNU (externe) mais lui donne des données d'alias shell, sinon pas . Plus important, il indique uniquement à quoi l'alias est défini, pas il a été défini, ce qui était le Q ici.
dave_thompson_085


-1

J'ai finalement trouvé la lldéfinition d'alias pour notre serveur Web (CentOS) dans deux scripts shell dans /etc/profile.d/:

  • /etc/profile.d/colorls.csh
  • /etc/profile.d/colorls.sh

Je l' ai trouvé d'abord l' apprentissage des commentaires ci - dessus où le profil de l' ensemble du système a été: /etc/profile. Ce fichier indique que les alias à l'échelle du système sont définis dans /etc/bashrc, et dans ce fichier, j'ai vu qu'il boucle à travers plusieurs scripts shell dans /etc/profile.d/, et donc j'ai utilisé grepdans ce répertoire et j'ai finalement trouvé les définitions. J'ai également découvert qu'il existe un l.alias qui répertorie tous les fichiers de points:

De colorls.sh:

alias ll='ls -l --color=auto' 2>/dev/null
alias l.='ls -d .* --color=auto' 2>/dev/null
alias ls='ls --color=auto' 2>/dev/null

(Il existe des alias équivalents dans colorls.csh.)


-1

Utilisez d'abord les commandes suivantes

Liste toutes les fonctions

functions 

Liste tous les alias

alias 

Si vous ne trouvez pas l'alias ou la fonction, envisagez une méthode de recherche plus agressive

Version bash

bash -ixlc : 2>&1 | grep thingToSearchHere

Version Zsh

zsh -ixc : 2>&1 | grep thingToSearchHere

Brève explication des options

-i     Force shell to be interactive.

-c     Take the first argument as a command to execute

-x      -- equivalent to --xtrace

-l      Make bash act as if invoked as a login shell
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.