¿Cuál es el comando unix para averiguar qué archivo ejecutable corresponde a un comando dado?

22

Por ejemplo, si se pasa lscomo entrada, debería decirme que /bin/lsse ejecutará si se ejecuta lsen la línea de comandos.

hugomg
fuente

Respuestas:

25

El comando a usar varía de shell a shell.

Solo un shell incorporado le dirá a uno correctamente lo que hará el shell para un nombre de comando dado, ya que solo los incorporados pueden conocer completamente los alias, las funciones del shell, otros incorporados, etc. Recuerde: no todos los comandos corresponden a archivos ejecutables en primer lugar.

  • Para el shell Bourne Again bash, el incorporado es el typecomando:

    $ type '['
    [ is a shell builtin
    
  • Para la concha de pescadofish , The typebuiltin funciona de manera similar a bash. Para obtener solo la ruta a un ejecutable, use command -v:

    $ type cat
    cat is /bin/cat
    $ command -v cat
    /bin/cat
    
  • Para el shell Korn, ksh, el built-in es el whencecomando - con typecreado inicialmente como un alias normal para whence -vy el commandincorporado en la -vopción equivalente a whence:

    $ whence -v ls
    ls is a tracked alias for /bin/ls
    
  • Para el Shell Z, zsh, el built-in es el whencemando, con el commandbuilt-in con la -vopción equivalente a whencey los muebles empotrados type, whichy whereequivalente a whencelas opciones -v, -cy -carespectivamente.

    $ whence ls
    /bin/ls
    
  • Por la Concha de TC, tcsh, el built-in es el whichcomando - que no debe confundirse con cualquier comando externo con ese nombre:

    > which ls
    ls: aliased to ls-F
    > which \ls
    /bin/ls
    

Otras lecturas

JdeBP
fuente
Tenga en cuenta que bajo ksh, "type" es un alias predeterminado para "whence -v", por lo que se puede usar al igual que con bourne shell y bash tradicionales.
jlliagre
typetambién está integrado en zsh?
Hongxu Chen
RHEL6 en el que RPM (p. Ej. which-2.19-6.el6.x86_64) Coloca un archivo de inicio /etc/profile.d/which2.sh. Esto se lee mediante shells que no son csh, incluido zsh. Se alias whicha sí mismo. Entonces, para los usuarios de zsh, en particular, anula las interrupciones incorporadas which.
Dan Pritts
14

Puedes usar whichpara esto:

aix@aix:~$ which ls
/bin/ls

Funciona buscando PATHarchivos ejecutables que coincidan con los nombres de los argumentos. Tenga en cuenta que no funciona con alias de shell:

aix@aix:~$ alias listdir=/bin/ls
aix@aix:~$ listdir /
bin    dev   initrd.img      lib32   media  proc  selinux  tmp  vmlinuz
...
aix@aix:~$ which listdir
aix@aix:~$

type, sin embargo, funciona:

aix@aix:~$ type listdir
listdir is aliased to `/bin/ls'
NPE
fuente
3
Tenga cuidado: si ls es una función o tiene un alias, quiere 'escribir ls' en lugar de 'which ls'
William Pursell
1
whichno es necesariamente suficiente por sí solo. Solo devuelve el primer nombre encontrado en $ PATH ... Ese nombre puede ser un enlace simbólico, y no el ejecutable real de fin de cadena .
Peter.O
8

whichno no (necesariamente) devolver el archivo ejecutable. Devuelve el primer nombre de archivo coincidente que encuentra en $ PATH (o múltiples archivos con nombre similar cuando se usa which -a) ... El ejecutable real puede estar a varios enlaces de distancia.

  • which locate
    /usr/bin/locate
    ``
  • file $(which locate)
    /usr/bin/locate: symbolic link to /etc/alternatives/locate'

El comando que encuentra el ejecutable real es readlink -e,
(junto con which)

  • readlink -e $(which locate)
    /usr/bin/mlocate

Para ver todos los enlaces intermedios :

f="$(which locate)"             # find name in $PATH
printf "# %s\n" "$f"
while f="$(readlink "$f")" ;do  # follow links to executable
    printf "# %s\n" "$f"
done

# /usr/bin/locate
# /etc/alternatives/locate
# /usr/bin/mlocate
Peter.O
fuente
4

Puedes probar:

whereis ls

Me da:

ls: /bin/ls /usr/share/man/man1/ls.1.gz
Ivan Morgillo
fuente