Qual é a diferença entre qual e onde

16

Qual é a diferença entre os comandos wheree whichshell? Aqui estão alguns exemplos

 ~  where cc
/usr/bin/cc
/usr/bin/cc
~  which cc
/usr/bin/cc

e

  ~  which which
which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde'
/usr/bin/which
  ~  which where
/usr/bin/which: no where in (/usr/local/bin:/bin:/usr/bin:/home/bnikhil/bin:/bin)

Além disso

  ~  where which
which: aliased to alias | /usr/bin/which --tty-only --read-alias --show-dot
 --show-tilde
which: shell built-in command
/usr/bin/which
/usr/bin/which
  ~  where where
where: shell built-in command

Para mim, parece que eles fazem a mesma coisa sendo um shell embutido, sem muita certeza de como isso é diferente de um comando?

Nikhil
fonte

Respostas:

11

zshé um dos poucos shells (os outros sendo tcsh( whichoriginados como um cshscript para cshusuários, que também tiveram sua limitação, tcshtornou-o um aprimoramento)) onde whichfaz algo sensato, já que é um shell embutido, mas de alguma forma você ou seu sistema operacional (através de algum rcarquivo) interrompeu-o substituindo-o por uma chamada para o whichcomando do sistema, que não pode fazer nada de forma confiável, pois não tem acesso aos internos do shell, por isso não pode saber como esse shell interpreta um nome de comando .

Em zsh, todos which, type, whencee wheresão builtin comandos que são usados para obter informações sobre quais comandos estão, mas com diferentes saídas. Eles estão todos lá por motivos históricos, você pode obter todos os comportamentos deles com diferentes sinalizadores para o whencecomando.

Você pode obter os detalhes do que cada um faz executando:

info -f zsh --index-search=which

Ou digite info zsh, abra o índice com ie digite o nome interno (a conclusão está disponível).

E evite usar /usr/bin/which. Hoje em dia não há shell onde isso which é necessário. Como Timothy diz, use o built-in que seu shell fornece para isso. A maioria das conchas POSIX terá o typecomando, e você pode usar command -vapenas para obter o caminho de um comando (embora ambos typee command -vsão opcionais no POSIX (mas não Unix, e não mais em LSB), eles estão disponíveis na maioria, se não todo o Conchas tipo Bourne que você provavelmente encontrará).

(BTW, parece que /usr/binaparece duas vezes no seu $PATH, você pode adicionar um typeset -U pathao seu ~/.zshrc)

Stéphane Chazelas
fonte
2
Isso surgiu em uma pergunta anterior também. Para estender esse ponto, você sempre deve usar um comando shell incorporado, onde existe. Portanto, no bash, use "type" em vez de "what".
Tim B
Excelente resposta e obrigado por essa dica também.
Nikhil