¿Hay una manera simple de enumerar todos los conflictos de comandos que se han producido en el sistema debido a la actualización de bashrc que involucra comandos de alias?
Por ejemplo, alguien escribe alias ls=/path/to/user-generated/executable
en bashrc. ¿Cómo se descubre que esto está enmascarando un comando real ( ls
)? Una forma parece ser ejecutar todos los alias antes y después de obtener bashrc y diferenciar la salida. ¿Hay alguna forma mejor?
Estoy ejecutando Ubuntu 12.04.
bash --version
GNU bash, versión 4.2.24 (1) -release (i686-pc-linux-gnu)
Respuestas:
Para averiguar qué comandos están enmascarados por alias, haga algo como esto:
Explicación
alias
solo enumera los alias definidos ysed
extrae su nombre. El ciclo while se ejecutatype -ta
en cada uno de ellos eawk
imprime las líneas que contienen alias y archivo.fuente
Puede usar
type
para averiguar cómo bash interpretaría un comando.fuente
type ls
imprimels is aliased to `ls --color=auto'
aquí.which
, pero ahora no sé si ambos (tipo, qué) construcciones de shell son iguales.type which
te dicewhich is /usr/bin/which
, por lo que no es un incorporado. Por lo tanto, no puede decirle si algo está incorporado o no (por ejemplo,which echo
versustype echo
).type which
which is a shell builtin
estoy usando el zsh.Como su primera pregunta, no hay forma de enumerar los conflictos, ya que bash usa una tabla hash internamente, solo registra la última anulación.
Para averiguar si un comando es un alias, use
alias ls
en su caso, si le dice algo como "no encontrado", entonces no es un alias, de lo contrario lo es.Para iniciar la función original sin tener en cuenta el alias, prefija una barra diagonal, por ejemplo
\ls
, lanzará el hash real ls, ignore el alias.EDITAR
Si desea saber rápidamente si un comando es un alias, puede habilitar el modo de depuración
set -x
ahora, si ejecutals
:Verá una salida de depuración del comando real que se está ejecutando
Para desactivar el modo de depuración, use
set -
fuente
alias
papel. ¿Qué sucede si un usuario no sabe que existe un comando (por ejemplols
)? Lo único que parece saber después de correralias ls
es a qué se asigna y no a qué se asignó originalmente. Supongo que uno tendrá que ejecutar todos los comandos con y sin \ para encontrar conflictos.Puede usar bash builtin
compgen
para obtener una lista de todos los comandos y todos los alias que usacompgen -ac
. Cualquier comando que también sea un alias se duplicará en esta lista, por lo que la solución simple e ingenua es buscar duplicados en la salida decompgen -ac
.Sin embargo, también pueden aparecer duplicados si un comando está en la ruta dos veces. Por ejemplo, tengo
/bin/which
y/usr/bin/which
asícompgen -ac
lo enumeraréwhich
dos veces aunque no sea un alias.Entonces, lo que se necesita es obtener todos los duplicados
compgen -ac
y compararlos con una lista de alias. Solo los duplicados que también son alias son esos alias que ocultan comandos. Podemos hacer esto con elcomm(1)
comando y con la sustitución del proceso bash.compgen -a | sort
es la lista de todos los alias (ordenados porcomm
).compgen -ac | sort | uniq -d
es la lista de todos los duplicados de la lista de comandos y alias.comm -12
genera solo aquellas líneas que son comunes a ambos.fuente
Puede usar la función de depuración de shell para ver exactamente lo que sucede cuando bash invoca un shell interactivo. Lo siguiente debería mostrarle todos los alias que se asignan cuando se genera un shell interactivo desde un shell de inicio de sesión:
-x
-> habilitar depuración-l
-> shell de inicio de sesión-i
-> shell interactivo-c
-> comandoSe requiere ejecutar el comando exit para que el shell regrese. En
-i
este caso, se requiere porque bash no configuraría un entorno interactivo para ejecutar un comando de lo contrario.Aquí hay un ejemplo de mi sistema:
Para ver qué archivo se obtuvo por última vez cuando se asignó el alias para determinar el archivo en el que se produjo, puede extender el grep:
Esto puede devolver falsos positivos, pero debería estar bien si está inspeccionando manualmente los datos devueltos. El número de símbolos '+' delante del comando ejecutado indica la profundidad.
En esta salida de muestra, muestra que .bashrc establece un alias para
ls
, .foo aliast
, y luego .bashrc anula el alias anterior det
.fuente