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 which
para 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 vim
tiene un alias, vim -X
pero 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 which
es un shell integrado con diferentes comportamientos en diferentes shells. En Bash, la sugerencia de SiegeX de la --skip-alias
bandera funciona; Sin embargo, estoy en Zsh. ¿Existe algo similar allí?
vim
viene esowhere vim
Respuestas:
which
en realidad es una mala manera de hacer cosas como esta, ya que hace suposiciones sobre su entorno$SHELL
y 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. (which
en mi Ubuntu 10.10 no entiende--skip-alias
como lo menciona @SiegeX, por ejemplo).type
utiliza 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 -P
omitirá 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
which
es 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ázsh
pero aparentemente nobash
, es más probable que use el entorno del shell y haga lo correcto).type
es 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 modernaswhich
es un shell incorporado y hace lo correcto; a veces el incorporado es en suwhat
lugar, y a veces no hay una buena manera de ver el entorno actual del shell desdecsh
/tcsh
en absoluto.fuente
type -a
parece devolver todas las instancias en tu$PATH
, no solo la primera. Creo que voy a aliaswhich
atype
:)type
es 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 distribucioneswhat
ywhich
si no están estandarizadas y no tienen funcionalidad adicional?info bash 'Bash builtins'
Linux, aunque también puede obtenerlo en elzsh
manual de referencia. Más oficialmente, pubs.opengroup.org/onlinepubs/009695399/utilities/type.html (lo cual noto que en realidad no especifica-P
o-a
, o incluso-p
cuál era la forma original-P
, pero sí requiere que use el entorno de shell actual).type -p
se comporta de manera diferente entre zsh y bash.type -P
no existe en zsh en absoluto.En
bash
:En
zsh
:En ambos:
O:
fuente
En zsh
which
hay una función incorporada, ya que este comando informa:Para ejecutar el comando externo (en cualquier shell)
which
, use la ruta completa :así
ls
se 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
dire
se encontró ningún comando.Para resolver alias anidados (manualmente) ver
Resolve nested aliases to their source commands
fuente
La mía definida como tal
fuente
Intenta lo siguiente:
fuente
which
realidad 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!which
no 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-alias
no es una opciónwhich
en Debian. ¿Hay diferentes variedades dewhich
flotar? 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-alias
opción./usr/bin/which
más un alias/etc/profile.d
que le permite manejar alias pero--skip-alias
funciona. Como resultadowhich which
muestra el alias, ¡perocommand which which
muestra el ejecutable!Otra alternativa es
command which vim
, que funciona de la misma manera en amboszsh
ybash
Por ejemplo, en mi mac:
fuente
Ambos
type
y sewhich
comportan de manera diferente según su tipo de shell.En bash,
which
existe un comando enPATH
. Busca el comando que proporcionasPATH
. Bash builtintype -P
(P forPATH
) se comporta exactamente igualwhich
.En ZSH, tanto
which
ytype
son órdenes internas, y las funciones parciales de orden internawhence
.which -p
es lo que quieres Se fuerza una búsqueda de ruta. (la-P
opción no está disponible paratype
ZSH).Más del manual de ZSH.
Para omitir
builtin
which
y forzar el uso del comandowhich
desdePATH
ZSH:fuente