Existe um bash embutido para 'what'?

16

Eu tenho testado uma instalação mínima do Fedora. Para verificar o caminho para intérpretes como python ou nó, eu normalmente uso which.

Percebo que whichnão está instalado por padrão. Eu poderia adicionar o pacote, mas me pergunto se há um shell embutido que possa ser usado para executar esta tarefa comum.

Estou usando o bash 4.2.

mikemaccana
fonte
11
De alguma forma, uma pesquisa pelo equivalente do Windows me trouxe aqui; para futuros espectadores: "where" indicará o caminho do arquivo especificado.
Rubber Duck
11
Encorajo qualquer pessoa que se deparar com este Q a ler também este Q&A da U&L. Abrange tudo o que você sempre quis saber which. Por que não usar "qual"? O que usar então?
Slm

Respostas:

26

Você pode usar type, que é um Bash embutido:

$ type -P which
which is /usr/bin/which

Para obter documentação, consulte help [t]ype, que se refere à typeseção na bashpágina do manual.

( help typeimprime as páginas de ajuda de dois componentes internos que começam com a string "type", um dos quais é obsoleto e completamente não relacionado a isso.)

l0b0
fonte
3
Eu gosto de type -amim por que os parênteses [t]ype?
Glenn Jackman
type -aimprimirá tudo o que o argumento aponta, e não apenas o que seria executado ao digitá-lo.
L0b0
2
Encorajo qualquer pessoa que se deparar com este Q a ler também este Q&A da U&L. Abrange tudo o que você sempre quis saber which. Por que não usar "qual"? O que usar então?
Slm
A primeira coisa na lista de type -aé sempre o que ele executaria. Eu faço o mesmo que Glenn e sempre uso type -atambém.
Slm
11
type -pnão mostra o caminho se o comando for um alias. type -Psempre mostra o caminho do comando corretamente. eu acho que. devemos atualizar a resposta aceita como type -P@ l0b0
dirigeant
10

Você pode usar typeou command -v. A saída de typeé legível por humanos; a saída de command -vpode ser executada pelo Bash.

Observe que eles são realmente um pouco diferentes. typee commandprocure o valor de hash do comando. Ou seja, se você digitar cmd, type cmdou command -v cmdvai dizer exatamente o que vai ser executado. Eles também trabalham com aliases, funções do Bash e componentes internos do Bash (embora type -pos ignorem e retornem apenas arquivos verdadeiros).

whichapenas faz uma pesquisa no PATH. Isso é diferente porque:

  • Se houver um alias, função ou interno com o mesmo nome, ele será chamado.
  • Se um comando foi adicionado anteriormente no PATH desde o último hash, ele será encontrado por which, mas a execução desse comando usará o valor do hash (você pode forçar a atualização do hash no Bash com hash -r).

Normalmente, as pessoas realmente querem type, não whichpelo menos para uso interativo, pois usam para descobrir "de onde vem esse comando quando eu o executo?" Você só deve usar whichse realmente deseja fazer uma pesquisa PATH.

asmeurer
fonte
command -vé o equivalente de ksh whence.
Henk Langeveld
11
Então nós temos where, whencee, claro who, também why, e when? Por que não existe what?
Hagen von Eitzen
echo 'main(){printf("what\n");}' | sudo cc -x c - -o /usr/local/bin/what
Ivan Vučica