zshє однією з небагатьох оболонок (інша історія tcsh( whichстворена як cshсценарій для cshкористувачів, яка також мала обмеження, tcshзробила це вбудованим як покращення)), де whichробиться щось розумне, оскільки це вбудована оболонка, але якимось чином ви або ваша ОС (через якийсь rcфайл) зламав його, замінивши його викликом до системної whichкоманди, яка не може зробити щось надійне надійно, оскільки не має доступу до інтернів оболонки, тому не може знати, як ця оболонка інтерпретує ім'я команди .
У Zsh, все which, type, whenceі whereє вбудованими командами, які все використовуються , щоб дізнатися про те, що команди, але з різними виходами. Вони все там з історичної причини, ви можете передати whenceкоманду всі їх поведінки з різними прапорами .
Ви можете отримати детальну інформацію про те, що кожен робить, запустивши:
info -f zsh --index-search=which
Або введіть info zsh, а потім підберіть індекс iі введіть вбудовану назву (завершення доступне).
І уникайте використання /usr/bin/which. Там немає оболонки в наш час , коли , що which необхідно. Як каже Тимофій, використовуйте вбудований, який надає ваша оболонка для цього. Більшість оболонок POSIX матимуть typeкоманду, і ви можете використовувати command -vлише для отримання шляху команди (хоча обидва typeі command -vє додатковими в POSIX (але не Unix і не більше в LSB), вони доступні в більшості, якщо не у всіх Борнові снаряди, які ви, швидше за все, коли-небудь натрапите).
(BTW, схоже, /usr/binз’являється двічі у вашому $PATH, ви можете додати typeset -U pathсвій ~/.zshrc)