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