Como la mayoría de los usuarios, tengo un conjunto de alias configurados para dar un conjunto predeterminado de marcas para los programas de uso frecuente. Por ejemplo,
alias vim='vim -X'
alias grep='grep -E'
alias ls='ls -G'
El problema es que si quiero usar whichpara ver de dónde proviene mi vim/ grep/ ls/ etc., el alias se interpone en el camino:
$ which vim
vim: aliased to vim -X
Esta es una salida útil, pero no es lo que estoy buscando en este caso; Sé que vimtiene un alias, vim -Xpero quiero saber de dónde viene eso vim .
A menos que temporalmente no defina el alias solo para poder usarlo which, ¿hay una manera fácil de which'desenvolver' el alias y ejecutarlo?
Editar: Parece que whiches un shell integrado con diferentes comportamientos en diferentes shells. En Bash, la sugerencia de SiegeX de la --skip-aliasbandera funciona; Sin embargo, estoy en Zsh. ¿Existe algo similar allí?

vimviene esowhere vimRespuestas:
whichen realidad es una mala manera de hacer cosas como esta, ya que hace suposiciones sobre su entorno$SHELLy los archivos de inicio (piensa) que utiliza shell; no solo a veces adivina mal, sino que generalmente no se puede decir que se comporte de manera diferente. (whichen mi Ubuntu 10.10 no entiende--skip-aliascomo lo menciona @SiegeX, por ejemplo).typeutiliza el entorno de shell actual en lugar de hurgar en sus archivos de configuración, y se le puede decir que ignore partes de ese entorno, por lo que le muestra lo que realmente suceda en lugar de lo que sucedería en una reconstrucción de su shell predeterminado.En este caso,
type -Pomitirá cualquier alias o función:También puede pedirle que despegue todas las capas, una a la vez, y que le muestre qué encontraría:
(Ampliando esto de los comentarios :)
El problema
whiches que generalmente es un programa externo en lugar de un shell incorporado, lo que significa que no puede ver sus alias o funciones y tiene que intentar reconstruirlos a partir de los archivos de inicio / configuración del shell. (Si se trata de un shell incorporado, como estázshpero aparentemente nobash, es más probable que use el entorno del shell y haga lo correcto).typees un comando compatible con POSIX que debe comportarse como si fuera un elemento incorporado (es decir, debe usar el entorno del shell desde el que se invoca, incluidas las funciones y los alias locales), por lo que generalmente es un elemento integrado.Por lo general, no se encuentra en
csh/tcsh, aunque en la mayoría de las versiones modernaswhiches un shell incorporado y hace lo correcto; a veces el incorporado es en suwhatlugar, y a veces no hay una buena manera de ver el entorno actual del shell desdecsh/tcshen absoluto.fuente
type -aparece devolver todas las instancias en tu$PATH, no solo la primera. Creo que voy a aliaswhichatype:)typees parte del estándar POSIX, ese es el camino a seguir. Para responder a mi pregunta, escriba works en zsh también (en Debian). ¿Por qué no se eliminan las distribucioneswhatywhichsi no están estandarizadas y no tienen funcionalidad adicional?info bash 'Bash builtins'Linux, aunque también puede obtenerlo en elzshmanual de referencia. Más oficialmente, pubs.opengroup.org/onlinepubs/009695399/utilities/type.html (lo cual noto que en realidad no especifica-Po-a, o incluso-pcuál era la forma original-P, pero sí requiere que use el entorno de shell actual).type -pse comporta de manera diferente entre zsh y bash.type -Pno existe en zsh en absoluto.En
bash:En
zsh:En ambos:
O:
fuente
En zsh
whichhay una función incorporada, ya que este comando informa:Para ejecutar el comando externo (en cualquier shell)
which, use la ruta completa :así
lsse encontró el comando (un valor de salida de 0) y se encuentra en/bin/ls.Adentro
zsh; Una forma (además de la anterior) para buscar comandos externos es:Sin embargo, eso no resolverá los alias anidados como:
El comando informará que no
direse encontró ningún comando.Para resolver alias anidados (manualmente) ver
Resolve nested aliases to their source commandsfuente
La mía definida como tal
fuente
Intenta lo siguiente:
fuente
whichrealidad es un shell incorporado y no una utilidad normal de Unix como había supuesto. Entonces debería editar mi pregunta y especificar Zsh. ¡Gracias por señalarme esto!whichno está integrado, al menos no en Debian. Es un script de shell y parte de debianutils, por lo que funciona en zsh. Sin embargo,--skip-aliasno es una opciónwhichen Debian. ¿Hay diferentes variedades dewhichflotar? Esto no parece ser un comando estandarizado.man zshbuiltins. que [-wpams] nombre ... Equivalente a donde -c.bash, no está integrado y no tiene la--skip-aliasopción./usr/bin/whichmás un alias/etc/profile.dque le permite manejar alias pero--skip-aliasfunciona. Como resultadowhich whichmuestra el alias, ¡perocommand which whichmuestra el ejecutable!Otra alternativa es
command which vim, que funciona de la misma manera en amboszshybashPor ejemplo, en mi mac:
fuente
Ambos
typey sewhichcomportan de manera diferente según su tipo de shell.En bash,
whichexiste un comando enPATH. Busca el comando que proporcionasPATH. Bash builtintype -P(P forPATH) se comporta exactamente igualwhich.En ZSH, tanto
whichytypeson órdenes internas, y las funciones parciales de orden internawhence.which -pes lo que quieres Se fuerza una búsqueda de ruta. (la-Popción no está disponible paratypeZSH).Más del manual de ZSH.
Para omitir
builtinwhichy forzar el uso del comandowhichdesdePATHZSH:fuente