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)