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), они доступны в большинстве, если не во всех Борновые снаряды, с которыми вы, вероятно, когда-либо сталкивались).
(Кстати, похоже, /usr/bin
дважды появляется в вашем $PATH
, вы могли бы добавить typeset -U path
к вашему ~/.zshrc
)