whichна самом деле это плохой способ делать такие вещи, так как он делает предположения о вашей среде на основе $SHELLи файлах запуска (которые он считает), которые использует оболочка; Мало того, что он иногда ошибается, но вы не можете сказать, что он ведет себя иначе. ( whichна моем Ubuntu 10.10 не понимает, --skip-aliasкак упомянуто, например, @SiegeX.) typeиспользует текущую среду оболочки вместо того, чтобы тыкать в ваши файлы конфигурации, и может быть сказано игнорировать части этой среды, поэтому он показывает вам, что на самом деле произойдет вместо того, что произойдет в реконструкции вашей оболочки по умолчанию.
В этом случае type -Pбудут обходиться любые псевдонимы или функции:
$ type -P vim
/usr/bin/vim
Вы также можете попросить его снять все слои, по одному, и показать вам, что он найдет:
$ type -a vim
vim is aliased to `vim -X'
vim is /usr/bin/vim
(Расширяя это из комментариев :)
Проблема в whichтом, что это обычно внешняя программа, а не встроенная оболочка, что означает, что она не может видеть ваши псевдонимы или функции и должна пытаться восстановить их из файлов запуска / конфигурации оболочки. (Если это встроенная оболочка, как она есть, zshно, по-видимому, нет bash, она с большей вероятностью использует среду оболочки и делает правильные вещи.)
typeэто POSIX-совместимая команда, которая должна вести себя так, как если бы она была встроенной (то есть она должна использовать среду оболочки, из которой вызывается, включая локальные псевдонимы и функции), поэтому обычно она является встроенной.
Обычно его нет в csh/ tcsh, хотя в большинстве современных версий whichон встроен в оболочку и делает все правильно; иногда whatвместо этого встроенный , а иногда нет никакого хорошего способа увидеть текущую среду оболочки из csh/ tcshвообще.
vimисходит , вы бы использовалиwhere vim