¿Cuál es la diferencia entre cuál y dónde?

16

¿Cuál es la diferencia entre wherey whichlos comandos de shell? Aquí hay unos ejemplos

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

y

  ~  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)

además

  ~  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 mí, parece que hacen lo mismo, uno siendo un shell incorporado, ¿no estás seguro de cómo eso es diferente de un comando?

nikhil
fuente

Respuestas:

11

zshes uno de los pocos shells (los otros están tcsh( whichoriginados como un cshscript para cshusuarios, que también tenían su limitación, lo tcshconvirtieron en una mejora)) donde whichhace algo sensato ya que es un shell incorporado, pero de alguna manera usted o su sistema operativo (a través de algún rcarchivo) lo rompió al reemplazarlo con una llamada al whichcomando del sistema que no puede hacer nada razonablemente confiable ya que no tiene acceso a los internos del shell, por lo que no puedo saber cómo ese shell interpreta el nombre de un comando .

En zsh, todos which, type, whencey whereson incorporado comandos que se usan para obtener información sobre lo que son los comandos, pero con diferentes salidas. Todos están allí por razones históricas, puede obtener todos sus comportamientos con diferentes indicadores para el whencecomando.

Puede obtener los detalles de lo que cada uno hace al ejecutar:

info -f zsh --index-search=which

O escriba info zsh, luego abra el índice con ie ingrese el nombre incorporado (la finalización está disponible).

Y evite usar /usr/bin/which. No hay hoy en día en la cáscara que which se necesita. Como dice Timothy, use la solución incorporada que su caparazón proporciona para eso. La mayoría de los shells POSIX tendrán el typecomando, y puede usarlo command -vpara obtener solo la ruta de un comando (aunque ambos typey command -vson opcionales en POSIX (pero no Unix, y ya no en LSB), están disponibles en la mayoría, si no en todos Conchas tipo Bourne con las que probablemente te encuentres).

(Por cierto, parece que /usr/binaparece dos veces en su $PATH, podría agregar un typeset -U patha su ~/.zshrc)

Stéphane Chazelas
fuente
2
Esto surgió en una pregunta anterior también. Para extender este punto, siempre debe usar un comando integrado de shell donde exista uno. Entonces, en bash, use "type" en lugar de "which".
Tim B
Excelente respuesta y gracias por ese consejo también.
nikhil