¿Es posible verificar dónde se definió un alias?

24

Un alias, como llse define con el aliascomando.

Puedo verificar el comando con cosas como type llqué impresiones

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

o command -v llque imprime

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

o alias llque también imprime

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

pero parece que no puedo encontrar dónde se definió el alias, es decir, un archivo como .bashrc, o quizás manualmente en el shell en ejecución. En este punto, no estoy seguro de si esto es posible.

¿Debo simplemente revisar todos los archivos cargados bashy verificar cada uno de ellos?

polemon
fuente
Fuera del puño, diría que corrasbash -xl
Jeff Schaller

Respuestas:

21

La definición manual será difícil de detectar (los registros del historial, tal vez) aunque le pida al shell que muestre lo que está haciendo y luego grepdebería ayudar a encontrarlos en un archivo rc:

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

Si el shell no captura con precisión las opciones necesarias con una de las invocaciones anteriores (que ejecutan interactivamente el comando nulo), entonces script:

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

Otra opción sería usar algo como straceo sysdigpara encontrar todos los archivos que toca el shell, luego ir a grepellos manualmente (útil si el shell o el programa no tiene una -xbandera); los archivos RC estándar no son suficientes para una verificación manual del nombre de archivo si algo como oh-my-zsh o configuraciones específicas del sitio extraen código de quién sabe dónde (o también puede haber variables de entorno, como señala sorontar en su respuesta) .

thrig
fuente
¡Gracias! Aunque la salida es un poco difícil de analizar, encontré el archivo que definía el alias que estaba buscando. Cuando el alias no está presente en ninguna parte de esa lista, ¿sería seguro asumir que el alias se definió manualmente?
polemon
@polemon algo seguro; podría (o haber sido) definido en un archivo que no se está leyendo debido a quién sabe qué razón o se eliminó (especialmente si hay algún tipo de marco de shell que agrega complejidad que el usuario no entender).
thrig
1
Para que el punto donde se define el alias sea un poco más fácil de encontrar, puede usar PS4, que se antepone a cada línea en una traza:PS4='+The ll alias is "${BASH_ALIASES["ll"]}" ' bash -ixlc :
Mark Plotnick
5

Aquí es donde me parece grep -rlmuy útil:

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

le dirá en qué archivo aliasse usa la palabra .

Probablemente en ~/.bashrcy sin duda en ~/.bash_aliasessi existe.


Sin embargo, es imposible estar absolutamente seguro de que eso cubre todas las opciones. Esos archivos también pueden llamar o cargar cualquier otro archivo. Una variable de entorno como ENV o $BASH_ENVpuede dirigir bash para cargar algunos otros archivos.

busca la variable BASH_ENV en el entorno, expande su valor si aparece allí y usa el valor expandido como el nombre de un archivo para leer y ejecutar.

Y los alias pueden incluso definirse estableciendo una variable (énfasis mío):

BASH_ALIASES
Una variable de matriz asociativa cuyos miembros corresponden a la lista interna de alias mantenida por el alias incorporado. Los elementos agregados a esta matriz aparecen en la lista de alias

sorontar
fuente
grep -rl alias ~/.bash*puede coincidir falsamente con los archivos de historial, ¡pero +1 por señalar la matriz BASH_ALIASES!
Jeff Schaller
2

No conozco una forma de enumerar realmente la fuente de sus alias, pero dado que parece que está usando bash, creo que estos son los posibles archivos fuente:

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

Debería poder buscar entre ellos para encontrar el alias, por ejemplo grep 'ls -l --color=auto' /etc/profile ~/.profile /etc/bash.bashrc ~/.bash_profile ~/.bashrc.

edaemon
fuente
O archivos incluidos desde allí ...
Jeff Schaller
@JeffSchaller - Correcto, necesitarías algo más complejo para eso bash -x, como mencionaste. Supuse que lo anterior era lo suficientemente fácil de ejecutar rápidamente y si no encuentra el alias, puede leer los pasos de ejecución.
edaemon
1

Combinando la respuesta de thrig con @ sugerencia de MarkPlotnick , se puede comprobar si BASH_ALIASES[ll]se ajusta a reducirlo. La BASH_SOURCEmatriz y las LINENOvariables son particularmente útiles aquí. Desafortunadamente, la verificación de si BASH_ALIASES[ll]se establece solo tendrá éxito después de que se haya establecido el alias, por lo que la primera línea de este tipo podría estar en otro archivo por completo.

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

Dando salida como:

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

Incluso puede terminar el shell utilizando esta verificación:

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

He tenido éxito simplemente usando which.

[crclayton@pc scripts]$ which foo
foo:     aliased to python $HOME/projects/python/foo.py
Charles Clayton
fuente
1
whichpuede manejar alias en tcsh (y tal vez csh anterior) y zsh donde está integrado, y en bash usando el perfil predeterminado en RedHat-family que tiene un kludge para ejecutar el programa GNU (externo) pero alimentarlo con datos de alias de shell, de lo contrario no . Más importante, solo dice en qué está configurado el alias, no dónde se configuró, cuál era la Q aquí.
dave_thompson_085
-1

Marque ~ / .profile si no está en ~ / .bashrc

Michael Tatum
fuente
O archivos incluidos desde allí ...
Jeff Schaller
-1

Finalmente encontré la lldefinición de alias para nuestro servidor web (CentOS) en dos scripts de shell en /etc/profile.d/:

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

Lo encontré por primera aprendizaje a partir de los comentarios de arriba donde estaba el perfil de todo el sistema: /etc/profile. Ese archivo indica que los alias de todo el sistema están definidos /etc/bashrc, y en ese archivo vi que recorre varios scripts de shell /etc/profile.d/, así que utilicé grepen ese directorio y finalmente encontré las definiciones. También descubrí que hay un l.alias que enumera todos los archivos de puntos:

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

(Hay alias equivalentes en colorls.csh.)

Jordan Bradford
fuente
-1

Primero use los siguientes comandos

Listar todas las funciones

functions 

Listar todos los alias

alias 

Si no encuentra el alias o la función, considere un método de búsqueda más agresivo

Versión bash

bash -ixlc : 2>&1 | grep thingToSearchHere

Versión Zsh

zsh -ixc : 2>&1 | grep thingToSearchHere

Breve explicación de las opciones

-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
jasonleonhard
fuente