Qual é o comando unix para descobrir qual arquivo executável corresponde a um determinado comando?

22

Por exemplo, se passado lscomo entrada, ele deve me dizer que /bin/lsserá executado se for executado lsna linha de comando.

hugomg
fonte

Respostas:

25

O comando a usar varia de shell para shell.

Somente um shell embutido dirá a alguém corretamente o que o shell fará por um determinado nome de comando, uma vez que somente os embutidos podem saber completamente sobre aliases, funções do shell, outros embutidos e assim por diante. Lembre-se: nem todos os comandos correspondem aos arquivos executáveis ​​em primeiro lugar.

  • Para o shell Bourne Again bash, o built-in é o typecomando:

    $ type '['
    [ is a shell builtin
    
  • Para a concha de peixefishtype ,, O builtin funciona da mesma forma que o bash. Para obter apenas o caminho de um executável, use command -v:

    $ type cat
    cat is /bin/cat
    $ command -v cat
    /bin/cat
    
  • Para a Shell Korn, ksh, o built-in é o whencecomando - com typecriado inicialmente como um apelido comum para whence -ve do commandbuilt-in com a -vopção equivalente a whence:

    $ whence -v ls
    ls is a tracked alias for /bin/ls
    
  • Para a Z Shell, zsh, o built-in é o whencecomando, com o commandbuilt-in com a -vopção equivalente ao whencee as built-ins type, whiche whereequivalente a whencecom as opções -v, -ce, -carespectivamente.

    $ whence ls
    /bin/ls
    
  • Para a Shell TC, tcsh, o built-in é o whichcomando - para não ser confundido com qualquer comando externo por esse nome:

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

Leitura adicional

JdeBP
fonte
Observe que no ksh, "type" é um alias padrão para "whence -v", portanto pode ser usado como no tradicional bourne shell e no bash.
Jlliagre 30/10
typetambém está embutido no zsh?
Hongxu Chen
RHEL6 em que o RPM (por exemplo, which-2.19-6.el6.x86_64) coloca um arquivo de inicialização /etc/profile.d/which2.sh. Isso é lido por shells não-csh, incluindo zsh. Alias whichpara si mesmo. Portanto, para usuários do zsh, em particular, ele substitui as quebras internas which.
Dan Pritts
14

Você pode usar whichpara isso:

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

Ele funciona pesquisando os PATHarquivos executáveis ​​que correspondem aos nomes dos argumentos. Observe que isto não funciona com aliases 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, no entanto, funciona:

aix@aix:~$ type listdir
listdir is aliased to `/bin/ls'
NPE
fonte
3
Tenha cuidado: se ls é uma função ou é alias, você quer 'ls tipo' e não 'que ls'
William Pursell
11
whichnão é necessariamente suficiente por si só. Ele retorna apenas o primeiro nome encontrado em $ PATH ... Esse nome pode ser um link simbólico, e não o executável final de cadeia .
Peter.O
8

whichse não (necessariamente) voltar o arquivo executável. Ele retorna o primeiro nome de arquivo correspondente encontrado em $ PATH (ou vários arquivos nomeados semelhantes ao usar which -a) ... O executável real pode estar a vários links de distância.

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

O comando que encontra o real executável é readlink -e,
(em conjugação com o which)

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

Para ver todos os links intermediários :

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
fonte
4

Podes tentar:

whereis ls

Isso me dá:

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