Qual é a diferença entre qual e onde?

11

Qual é a diferença entre os comandos where e which shell? 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)

também

  ~  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, não muito certo de como isso é diferente de um comando?

    
por nikhil 05.02.2013 / 13:30

1 resposta

9

zsh é um dos poucos shells (os outros são tcsh ( which originados como csh script para csh users, que também tinha sua limitação, tcsh fez com que ele fosse construído como uma melhoria)) onde which faz algo sensato já que é um shell embutido, mas de alguma forma você ou seu sistema operacional (através de algum arquivo rc ) o quebrou substituindo-o por uma chamada ao comando which do sistema que pode ' Não faça qualquer coisa sensata de forma confiável, uma vez que não tem acesso aos internos do shell, portanto, não pode saber como esse shell interpreta um nome de comando.

No zsh, todos os which , type , whence e where são comandos incorporados que são usados para descobrir quais são os comandos, mas com saídas diferentes. Eles estão todos lá por razões históricas, você pode obter todos os seus comportamentos com bandeiras diferentes para o comando whence .

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

info -f zsh --index-search=which

Ou digite info zsh , depois exiba o índice com i e insira o nome incorporado (a conclusão está disponível).

E evite usar /usr/bin/which . Não há shell hoje em dia em que é necessário which . Como Timothy diz, use o builtin que seu shell fornece para isso. A maioria dos shells POSIX terá o comando type , e você pode usar command -v para obter apenas o caminho de um comando (embora type e command -v sejam opcionais no POSIX (mas não no Unix, e não mais em LSB), eles estão disponíveis na maioria, se não em todos os shells parecidos com Bourne, que você provavelmente encontrará.

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

    
por 05.02.2013 / 13:42