2010-05-19 24 views
82

Sé que cuando estás en shell, los únicos comandos que se pueden usar son los que se pueden encontrar en algún directorio establecido en PATH. Incluso 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:Shell - ¿Cómo encontrar el directorio de algún comando?

Vengo a shell y escribo:

$ lshw 

Quiero saber un comando en el shell que me diga DONDE se encuentra este comando. En otras palabras, ¿dónde se encuentra este "archivo ejecutable"?

Algo así como:

$ location lshw 
/usr/bin 

cualquier persona?

Respuesta

106

Si está utilizando bash o zsh, utilice esto:

type -a lshw 

Esto mostrará si el objetivo es una orden interna, una función, un alias o un ejecutable externo. Si este último, mostrará cada lugar que aparece en su 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, para funciones type -a también mostrará la definición de función. Puede usar declare -f functionname para hacer lo mismo (debe usar eso para zsh, ya que type -a no).

+0

¡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 el momento, estaba tratando de encontrar algún archivo update.sh en algún lugar, y no pude encontrarlo. Es por eso que comencé esta pregunta. Pero ahora, al usar 'type -a update' encontré que esto era solo un alias definido en mi .bashrc ubicado en mi ~ home. De verdad gracias. –

+0

@Gabriel: si no está familiarizado con 'locate' puede ayudar a encontrar archivos. Utiliza una base de datos mantenida por 'updatedb' que se ejecuta desde un trabajo cron. Como 'locate' busca una base de datos en lugar de todo el sistema de archivos, es mucho más rápido que' encontrar' (que podría usarse como último recurso). –

+0

Gracias. Estudiaré esta herramienta y veré cómo updateb está programado para ejecutarse en el cronjob de Ubuntu. –

42

De esta manera:

which lshw 
+4

también -una lshw para ver todos los comandos que coinciden en su camino. – AlG

+0

Creo que esto solo funciona con comandos (ejecutables en $ PATH), no con funciones. –

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 
15

PATH es una variable de entorno, y se pueden visualizar con el comando echo:

echo $PATH 

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

El comando which t ells que el que fichero es ejecutado cuando se ejecuta un comando:

which lshw 

veces lo que se obtiene es una ruta a un enlace simbólico; Si desea realizar el seguimiento que enlazan a donde vive el ejecutable real, puede utilizar readlink y alimentar la salida de which:

readlink -f $(which lshw) 

El parámetro -f instruye readlink para mantener siguiendo el enlace simbólico de forma recursiva.

He aquí un ejemplo de mi máquina:

$ which firefox 
/usr/bin/firefox 

$ readlink -f $(which firefox) 
/usr/lib/firefox-3.6.3/firefox.sh 
0

El Korn, ksh, ofrece la whence built-in, que identifica otra concha empotrados, macros, etc. El comando which es más portátil, sin embargo.

+1

En ksh, 'whence -a' es similar al' tipo -a de Bash. –

Cuestiones relacionadas