Основное различие - это /usr/local
для программного обеспечения, не управляемого системным поставщиком программного блока, но все еще после стандартных правил развертывания Unix.
Вот почему Вы имеете /usr/local/bin
, /usr/local/sbin
/usr/local/include
и т.д...
/opt
с другой стороны, для программного обеспечения, которое не следует за этим и развертывается монолитным способом. Это обычно включает коммерческое и/или межплатформенное программное обеспечение, которое упаковывается в стиле "Windows".
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
вообще.
В bash
:
type -P vim
В zsh
:
type -p vim
В обоих:
/usr/bin/which vim
Или:
( unalias vim; type vim )
which
на самом деле встроенная оболочка и не регулярная утилита Unix, как я предположил. Таким образом, я должен отредактировать свой вопрос и указать Zsh. Спасибо за указание на это мне!
– Adrian Petrescu
02.04.2011, 23:37
which
не встроенное, по крайней мере, не на Debian. Это - сценарий оболочки и часть debianutils, так работы над zsh. Однако --skip-alias
не опция which
на Debian. Есть ли различные варианты which
плавание вокруг? Это, кажется, не стандартизированная команда.
– Faheem Mitha
03.04.2011, 00:01
man zshbuiltins
. какой [-wpams] называют... Эквивалентный откуда-c.
– Mikel
03.04.2011, 01:03
/usr/bin/which
плюс псевдоним в /etc/profile.d
это позволяет ему обработать псевдонимы, но --skip-alias
работы. В результате which which
показывает псевдоним, но command which which
показывает исполняемый файл!
– dave_thompson_085
04.12.2015, 03:58
В zsh , который
является встроенным, как сообщает эта команда:
$ whence -w which
which: builtin
Чтобы выполнить внешнюю команду (в любой оболочке) , которая
,
используйте Полный путь :
$ /bin/which ls; echo $?
/bin/ls
0
, таким образом, была найдена команда ls
(значение выхода 0), и она находится в / bin / ls
.
Внутри zsh
; способ (помимо приведенного выше) для поиска внешних команд :
$ whence -p ls
/bin/ls
Однако это не разрешит вложенные псевдонимы, такие как:
$ alias dire='ls -l'
Команда сообщит, что нет dire
команда найдена.
$ whence -p dire; echo $?
1
Для разрешения вложенных псевдонимов (вручную) см. Разрешение вложенных псевдонимов их исходным командам
Другая альтернатива - команда vim
, которая работает одинаково и в zsh
, и в bash
Например, на моем mac:
LOLcalhost :: ~ % command which grep
/usr/local/bin/grep
Mine определен как таковой
alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde'
И type
, и which
ведут себя по-разному в зависимости от типа вашей оболочки.
В bash which
— это команда, существующая в PATH
. Он ищет команду, указанную вами в PATH
. Встроенный Bashtype -P
(P дляPATH
)ведет себя точно так же, как which
.
В ZSH как which
, так и type
являются встроенными и частичными функциями встроенного whence
. which -p
это то, что вы хотите. Это заставляет искать путь. Опция(-P
недоступна для type
ZSH.)
whence [ -vcwfpamsS ] [ -x num ] name...
-p
Do a path search for name even if it is an alias, reserved word, shell function or builtin.
Еще из руководства ZSH.
which [ -wpamsS ] [ -x num ] name...
Equivalent to whence -c.
Чтобы пропуститьbuiltin
which
и принудительно использовать команду which
из PATH
в ZSH:
alias which="command which"
type -a
кажется, возвращает все экземпляры на Вашем$PATH
, не только первый. Я думаю, что искажуwhich
кому:type
:) – Adrian Petrescu 02.04.2011, 23:49type
часть стандарта POSIX затем, это - способ пойти. Для ответа на мой вопрос введите работы над zsh также (на Debian). Почему дистрибутивы не избавляются отwhat
иwhich
если они не стандартизированы и не имеют дополнительной функциональности? – Faheem Mitha 03.04.2011, 00:05info bash 'Bash builtins'
на Linux, хотя можно также получить его, формируютсяzsh
справочник. Более официально, pubs.opengroup.org/onlinepubs/009695399/utilities/type.html (то, которое я отмечаю, не делает на самом деле спецификации-P
или-a
, или даже-p
который был исходной формой-P
, но действительно требует, чтобы это использовало текущую среду оболочки). – geekosaur 03.04.2011, 00:23type -p
ведет себя по-другому между zsh и ударом.type -P
не существует в zsh вообще. – kojiro 23.09.2016, 23:04