Creo que la mayoría está familiarizada con el which
comando, y lo uso con frecuencia. Acabo de encontrarme con una situación en la que tengo curiosidad, no solo sobre qué comando está primero en mi camino, sino cuántos y dónde están todos los comandos en todos mis caminos. Probé la página de manual (escribir man which
me hizo reír), pero no vi nada.
19
which --all
.which -a
.Respuestas:
En algunos sistemas,
which -a
muestra todas las coincidencias. Si su shell es bash o zsh¹, puede usartype
en su lugar:type foo
muestra la primera coincidencia ytype -a foo
muestra todas las coincidencias. Los tres comandostype
,which
ywhence
hacen sobre todo lo mismo; difieren entre shells y sistemas operativos en disponibilidad, opciones y qué informan exactamente.type
siempre está disponible y muestra todos los posibles nombres similares a comandos (alias, palabras clave, funciones integradas de shell, funciones y comandos externos).La única forma totalmente portátil de mostrar todas las coincidencias es analizarse
$PATH
usted mismo. Aquí hay un script de shell que hace esto. Si usted lo hace una función de shell, asegúrese de encerrar el cuerpo de la función entre paréntesis (de modo que el cambio enIFS
yset -f
no escapan a la función), y el cambioexit
areturn
.¹ O ksh 93, según la documentación, aunque ksh 93s + 2008-01-31 solo imprime la primera coincidencia cuando lo intento.
fuente
sh
código no funciona correctamente si hay componentes vacíos$PATH
. También tenga en cuenta que$IFS
es un delimitador de campo (al menos en shells POSIX) mientras que en$PATH
, dos puntos se utiliza como separador de campo . Vea elwhich
script que se encuentra en Debian para una implementación correcta.type
incorporado enksh93u+ 2012-08-01
parece funcionar correctamente.El indicador --all o -a le mostrará todas las coincidencias en su camino y alias (al menos en Fedora, Ubuntu y CentOS):
En AIX y Solaris, esto te acercará:
fuente
$PATH
contiene espacios en blanco o caracteres de concha.read -r
Es necesario hacer frente a las barras invertidas. Este no es un buen método porquefind
llevará mucho tiempo y puede devolver coincidencias espurias si un directorio$PATH
contiene subdirectorios. Afortunadamente,find
no es útil aquí; mira mi respuestaSi no tiene un
which
soporte-a
o no estáwhence
disponible, enrolle el suyo:fuente
set -f
desactivar el engorde de los desprotegidos$PATH
.test -f
no es suficiente ya que solo se necesitan archivos ejecutables aquí; lo que necesitatest -x
. Hmm, me doy cuenta de que olvidé la prueba de archivo normal en mi script.whence README.txt
tan improbable comowhence "file* wi?h we!rd name"
. Solo trato de mostrar lo fácil que es atravesar$PATH
.ksh y zsh tienen "de dónde" como shell incorporado.
whence -a
hace lo que quieres bajo zsh:Tengo que limpiar PATH en zsh, tengo muchos duplicados.
whence -a
funciona de manera diferente bajo ksh:Tengo que decir que también parece un comportamiento potencialmente útil.
fuente