Creo que la mayoría está familiarizada con el whichcomando, 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 whichme hizo reír), pero no vi nada.
                19
            
  
            
which --all.which -a.Respuestas:
En algunos sistemas,
which -amuestra todas las coincidencias. Si su shell es bash o zsh¹, puede usartypeen su lugar:type foomuestra la primera coincidencia ytype -a foomuestra todas las coincidencias. Los tres comandostype,whichywhencehacen sobre todo lo mismo; difieren entre shells y sistemas operativos en disponibilidad, opciones y qué informan exactamente.typesiempre 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
$PATHusted 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 enIFSyset -fno escapan a la función), y el cambioexitareturn.¹ O ksh 93, según la documentación, aunque ksh 93s + 2008-01-31 solo imprime la primera coincidencia cuando lo intento.
fuente
shcódigo no funciona correctamente si hay componentes vacíos$PATH. También tenga en cuenta que$IFSes un delimitador de campo (al menos en shells POSIX) mientras que en$PATH, dos puntos se utiliza como separador de campo . Vea elwhichscript que se encuentra en Debian para una implementación correcta.typeincorporado enksh93u+ 2012-08-01parece 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
$PATHcontiene espacios en blanco o caracteres de concha.read -rEs necesario hacer frente a las barras invertidas. Este no es un buen método porquefindllevará mucho tiempo y puede devolver coincidencias espurias si un directorio$PATHcontiene subdirectorios. Afortunadamente,findno es útil aquí; mira mi respuestaSi no tiene un
whichsoporte-ao no estáwhencedisponible, enrolle el suyo:fuente
set -fdesactivar el engorde de los desprotegidos$PATH.test -fno 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.txttan 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 -ahace lo que quieres bajo zsh:Tengo que limpiar PATH en zsh, tengo muchos duplicados.
whence -afunciona de manera diferente bajo ksh:Tengo que decir que también parece un comportamiento potencialmente útil.
fuente