Shell - Como encontrar o diretório de algum comando?

127

Eu sei que quando você está no shell, os únicos comandos que podem ser usados ​​são aqueles que podem ser encontrados em algum diretório definido no PATH. Mesmo eu não sei como ver o que os dirs estão na minha variável PATH (e essa é outra boa pergunta que pode ser respondida), o que eu gostaria de saber é:

Venho descascar e escrever:

$ lshw

Quero conhecer um comando no shell que possa me dizer ONDE esse comando está localizado. Em outras palavras, onde esse "arquivo executável" está localizado?

Algo como:

$ location lshw
/usr/bin

Qualquer um?

Gabriel L. Oliveira
fonte

Respostas:

187

Se você estiver usando o Bash ou o zsh, use o seguinte:

type -a lshw

Isso mostrará se o destino é um executável interno, uma função, um alias ou um executável externo. Neste último caso, ele mostrará cada local que aparecer no seu 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

No Bash, as funções type -atambém exibirão a definição da função. Você pode usar declare -f functionnamepara fazer a mesma coisa (você deve usar isso para zsh, já type -aque não).

Pausado até novo aviso.
fonte
Obrigado a todos que responderam, mas essa resposta foi a mais emocionante! Obrigado! Eu estava pensando que sou louco, porque defini (há muito tempo) uma maneira de fazer isso: 'update', e isso tem feito 'apt-get update; apt-get dist-upgrade 'para mim. Mas, por enquanto, eu estava tentando encontrar algum arquivo update.sh em algum lugar e não consegui encontrá-lo. Por isso comecei esta pergunta. Mas agora, usando 'type -a update', descobri que esse era apenas um apelido definido no meu .bashrc localizado na minha ~ home. Realmente obrigado.
Gabriel L. Oliveira
1
@ Gabriel: Se você não estiver familiarizado com locateisso, pode ajudar a encontrar arquivos. Ele usa um banco de dados mantido pelo updatedbqual é executado a partir de um trabalho cron. Como locatepesquisa em um banco de dados e não em todo o sistema de arquivos, é muito mais rápido do que find(que poderia ser usado como último recurso).
Pausado até novo aviso.
Obrigado. Vou estudar esta ferramenta e ver como o updatedb está programado para ser executado no cronjob do Ubuntu.
Gabriel L. Oliveira
Às vezes type -apode ser confuso. por exemplo, no caso de nvmqual é uma função bash que eu precisava fazer: type -a nvm | head -n1descobrir o que exatamente é nvm.
Marinos An
@MarinosAn: Para funções, type -agera a definição da função e o tipo de executável. O risco do uso headé que, no caso de nomes com mais de um tipo, os tipos adicionais não seriam gerados. Você pode querer olhar type -t.
Pausado até novo aviso.
64

Como isso:

which lshw

Para ver todos os comandos que correspondem ao seu caminho:

which -a lshw 
Ignacio Vazquez-Abrams
fonte
7
também qual -a lshw para ver todos os comandos que correspondem ao seu caminho.
ALG
Eu acredito que isso só funciona com comandos (executáveis ​​no $ PATH), não funções.
Olivier Lacan
whiché problemático porque há várias implementações, muitas das quais fazem a coisa errada e outras parecem funcionar bem, mas têm surpresas estranhas. Você deve preferir type.
Tripleee 25/03/19
Não funciona para aliases e funções do bash. Pelo menos no ubuntu. Melhor usotype -a lshw
Marinos An
17

PATH é uma variável de ambiente e pode ser exibida com o comando echo:

echo $PATH

É uma lista de caminhos separados pelo caractere de dois pontos ': '

O whichcomando informa qual arquivo é executado quando você executa um comando:

which lshw

às vezes o que você recebe é o caminho para um link simbólico; se você deseja rastrear esse link para onde reside o executável real, poderá usar readlinke alimentar a saída de which:

readlink -f $(which lshw)

O -fparâmetro instruireadlink a continuar seguindo o link simbólico recursivamente.

Aqui está um exemplo da minha máquina:

$ which firefox
/usr/bin/firefox

$ readlink -f $(which firefox)
/usr/lib/firefox-3.6.3/firefox.sh
hasen
fonte
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
fonte
3

No Shell TENEX C, tcsh , é possível listar a (s) localização (ões) de um comando ou, se for um comando interno, usando o wherecomando, por exemplo:

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

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

O shell Korn,, kshoferece o whenceembutido, que identifica outros embutidos, macros, etc. do shell which. Porém, o comando é mais portátil.

mpez0
fonte
1
No ksh, whence -aé semelhante ao do Bash type -a.
Pausado até novo aviso.
0

Uma alternativa para type -aécommand -V

Como na maioria das vezes estou interessado apenas no primeiro resultado, também cano da cabeça. Dessa forma, a tela não será inundada com código no caso de uma função bash.

command -V lshw | head -n1
Marinos An
fonte