Shell - ¿Cómo encontrar el directorio de algún comando?

127

Sé que cuando está en shell, los únicos comandos que se pueden usar son los que se pueden encontrar en algún conjunto de directorios en PATH. Incluso si no sé cómo ver qué directorios están en mi variable PATH (y esta es otra buena pregunta que podría responderse), lo que me gustaría saber es:

Vengo a shell y escribo:

$ lshw

Quiero saber un comando en shell que pueda decirme DÓNDE se encuentra este comando. En otras palabras, ¿dónde se encuentra este "archivo ejecutable"?

Algo como:

$ location lshw
/usr/bin

¿Nadie?

Gabriel L. Oliveira
fuente

Respuestas:

187

Si está usando Bash o zsh, use esto:

type -a lshw

Esto mostrará si el objetivo es un builtin, una función, un alias o un ejecutable externo. Si es lo último, mostrará cada lugar en el que aparece PATH.

bash$ type -a lshw
lshw is /usr/bin/lshw
bash$ type -a ls
ls is aliased to `ls --color=auto'
ls is /bin/ls
bash$ zsh
zsh% type -a which
which is a shell builtin
which is /usr/bin/which

En Bash, las funciones type -atambién mostrarán la definición de la función. Puedes declare -f functionnamehacer lo mismo (tienes que usar eso para zsh, ya type -aque no).

Pausado hasta nuevo aviso.
fuente
¡Gracias a todos los que respondieron, pero esta respuesta fue la más emocionante! ¡Gracias! Estaba pensando que estoy loco, porque definí (hace mucho tiempo) una forma de hacer esto: 'actualizar', y esto ha estado haciendo 'apt-get update; apt-get dist-upgrade 'para mí. Pero por ahora, estaba tratando de encontrar algún archivo update.sh en alguna parte, y no pude encontrarlo. Por eso comencé esta pregunta. Pero ahora, usando 'type -a update' descubrí que esto era solo un alias definido en mi .bashrc ubicado en mi ~ home. De verdad gracias.
Gabriel L. Oliveira
1
@ Gabriel: Si no está familiarizado con locateesto, puede ayudarlo a encontrar archivos. Utiliza una base de datos mantenida por la updatedbcual se ejecuta desde un trabajo cron. Dado que locatebusca en una base de datos en lugar de en todo el sistema de archivos, es mucho más rápido que find(lo que podría usarse como último recurso).
Pausado hasta nuevo aviso.
Gracias. Estudiaré esta herramienta y veré cómo se ha actualizado updatedb para ejecutarse en el cronjob de Ubuntu.
Gabriel L. Oliveira
A veces type -apuede ser confuso. por ejemplo, en caso de nvmque sea una función bash que necesitaba hacer: type -a nvm | head -n1averiguar qué es exactamente nvm.
Marinos An
@MarinosAn: para las funciones, type -agenera la definición de la función y el tipo de ejecutable. El riesgo con el uso heades que, en el caso de nombres con más de un tipo, no se generarán los tipos adicionales. Es posible que desee mirar type -t.
Pausado hasta nuevo aviso.
64

Me gusta esto:

which lshw

Para ver todos los comandos que coinciden en su ruta:

which -a lshw 
Ignacio Vazquez-Abrams
fuente
77
también que -a lshw para ver todos los comandos que coinciden en su ruta.
AlG
Creo que esto solo funciona con comandos (ejecutables en $ PATH), no con funciones.
Olivier Lacan
whiches problemático porque hay múltiples implementaciones, muchas de las cuales hacen completamente lo incorrecto, y otras parecen funcionar bien, pero tienen sorpresas extrañas. Deberías preferir en su typelugar.
tripleee
No funciona para alias y funciones bash. Al menos en ubuntu. Mejor usotype -a lshw
Marinos An
17

PATH es una variable de entorno y se puede mostrar con el comando echo:

echo $PATH

Es una lista de caminos separados por el carácter de dos puntos ' :'

El whichcomando le dice qué archivo se ejecuta cuando ejecuta un comando:

which lshw

a veces lo que obtienes es una ruta a un enlace simbólico; si desea rastrear ese enlace hasta donde vive el ejecutable real, puede usarlo readlinky alimentarlo con la salida de which:

readlink -f $(which lshw)

El -fparámetro le indica readlinkque siga siguiendo el enlace simbólico de forma recursiva.

Aquí hay un ejemplo de mi máquina:

$ which firefox
/usr/bin/firefox

$ readlink -f $(which firefox)
/usr/lib/firefox-3.6.3/firefox.sh
Hasen
fuente
5
~$ echo $PATH
/home/jack/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
~$ whereis lshw
lshw: /usr/bin/lshw /usr/share/man/man1/lshw.1.gz
Jack
fuente
3

En TENEX C Shell, tcsh , se pueden enumerar las ubicaciones de un comando, o si es un comando incorporado, utilizando el wherecomando, por ejemplo:

tcsh% where python
/usr/local/bin/python
/usr/bin/python

tcsh% where cd
cd is a shell built-in
/usr/bin/cd
Pierz
fuente
0

El shell Korn ksh, ofrece el whenceincorporado, que identifica otros complementos incorporados, macros, etc. whichSin embargo, el comando es más portátil.

mpez0
fuente
1
En ksh, whence -aes similar a Bash type -a.
Pausado hasta nuevo aviso.
0

Una alternativa a type -aescommand -V

Como la mayoría de las veces estoy interesado solo en el primer resultado, también lo hago desde la cabeza. De esta manera, la pantalla no se inundará de código en caso de una función bash.

command -V lshw | head -n1
Marinos An
fuente