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

17

Por exemplo, se passou ls como entrada, ele deve me dizer que /bin/ls será executado se executar ls na linha de comando.

    
por hugomg 29.10.2011 / 17:38

4 respostas

22

O comando a ser usado varia de shell para shell.

Apenas um shell embutido dirá a um corretamente o que o shell fará para um dado nome de comando, já que somente os built-ins podem conhecer completamente aliases, funções de shell, outros built-ins e assim por diante. Lembre-se: nem todos os comandos correspondem a arquivos executáveis em primeiro lugar.

  • Para o shell Bourne Again, bash , o interno é o comando type :

    $ type '['
    [ is a shell builtin
    
  • Para o shell Fish, fish , o type construído funciona de forma semelhante ao bash. Para obter apenas o caminho para um executável, use command -v :

    $ type cat
    cat is /bin/cat
    $ command -v cat
    /bin/cat
    
  • Para o Korn Shell, ksh , o interno é o comando whence - com type inicialmente configurado como um alias comum para whence -v e o command built-in com a opção -v equivalente a whence :

    $ whence -v ls
    ls is a tracked alias for /bin/ls
    
  • Para o Z Shell, zsh , o interno é o comando whence , com o command integrado com a opção -v equivalente a whence e os recursos internos type , which e where equivalentes a whence com as opções -v , -c e -ca , respectivamente.

    $ whence ls
    /bin/ls
    
  • Para o T C Shell, tcsh , o built-in é o comando which - não deve ser confundido com nenhum comando externo com esse nome:

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

Leitura adicional

por 30.10.2011 / 01:09
14

Você pode usar which para isso:

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

Funciona pesquisando o PATH dos arquivos executáveis que correspondem aos nomes dos argumentos. Observe que isso 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'
    
por 29.10.2011 / 17:39
7

which não (necessariamente) retorna o arquivo executável. Ele retorna o primeiro arquivo correspondente nome que encontra no $ PATH (ou vários arquivos com o mesmo nome ao usar which -a ) ... O executável real pode ter vários links de distância .

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

O comando que encontra o executável atual é readlink -e ,
(em conjunto com which )

  • readlink -e $(which locate) em /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
    
por 30.10.2011 / 01:01
4

Você pode tentar:

whereis ls

Isso me dá:

ls: /bin/ls /usr/share/man/man1/ls.1.gz
    
por 29.10.2011 / 22:58