Как использовать 'который' на искаженной команде?

Основное различие - это /usr/local для программного обеспечения, не управляемого системным поставщиком программного блока, но все еще после стандартных правил развертывания Unix.

Вот почему Вы имеете /usr/local/bin, /usr/local/sbin /usr/local/include и т.д...

/opt с другой стороны, для программного обеспечения, которое не следует за этим и развертывается монолитным способом. Это обычно включает коммерческое и/или межплатформенное программное обеспечение, которое упаковывается в стиле "Windows".

77
15.07.2011, 02:20
7 ответов

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 вообще.

108
27.01.2020, 19:31
  • 1
    Спасибо! Это - что-то очень полезное для добавления к моему набору хитрых приемов. Мне особенно нравится этот type -a кажется, возвращает все экземпляры на Вашем $PATH, не только первый. Я думаю, что искажу which кому: type :) –  Adrian Petrescu 02.04.2011, 23:49
  • 2
    geekosaur:Спасибо. если type часть стандарта POSIX затем, это - способ пойти. Для ответа на мой вопрос введите работы над zsh также (на Debian). Почему дистрибутивы не избавляются от what и which если они не стандартизированы и не имеют дополнительной функциональности? –  Faheem Mitha 03.04.2011, 00:05
  • 3
    Нет, даже удаленно. –  geekosaur 03.04.2011, 00:07
  • 4
    @Faheem: документация ре, я запустил бы с info bash 'Bash builtins' на Linux, хотя можно также получить его, формируются zsh справочник. Более официально, pubs.opengroup.org/onlinepubs/009695399/utilities/type.html (то, которое я отмечаю, не делает на самом деле спецификации -P или -a, или даже -p который был исходной формой -P, но действительно требует, чтобы это использовало текущую среду оболочки). –  geekosaur 03.04.2011, 00:23
  • 5
    type -p ведет себя по-другому между zsh и ударом. type -P не существует в zsh вообще. –  kojiro 23.09.2016, 23:04

В bash:

type -P vim

В zsh:

type -p vim

В обоих:

/usr/bin/which vim

Или:

( unalias vim; type vim )
16
27.01.2020, 19:31
  • 1
    Последний прохладен. У нас может быть псевдоним, чтобы сделать это. :) –  balki 15.07.2011, 09:23
  • 2
    В ударе на Redhat я должен использовать тип-P, и не, который, если я хочу корректный ответ. Никакие псевдонимы или функции не затронуты. MS-DOS –   01.12.2017, 16:44
  • 3
    , который, "который"? Который Red Hat? –  Mikel 02.12.2017, 00:15
  • 4
    @Mikel RH7.4. GNU, который v2.20. –   04.12.2017, 11:24

Попробуйте следующее:

which --skip-alias vim
1
27.01.2020, 19:31
  • 1
    Интересный! Это работает над Bash, но не над Zsh (я действительно не думал, что это было зависимым от оболочки). Это заставило меня понять это which на самом деле встроенная оболочка и не регулярная утилита Unix, как я предположил. Таким образом, я должен отредактировать свой вопрос и указать Zsh. Спасибо за указание на это мне! –  Adrian Petrescu 02.04.2011, 23:37
  • 2
    which не встроенное, по крайней мере, не на Debian. Это - сценарий оболочки и часть debianutils, так работы над zsh. Однако --skip-alias не опция which на Debian. Есть ли различные варианты which плавание вокруг? Это, кажется, не стандартизированная команда. –  Faheem Mitha 03.04.2011, 00:01
  • 3
    @Faheem Mitha: Это - zsh встроенное. Посмотрите man zshbuiltins. какой [-wpams] называют... Эквивалентный откуда-c. –  Mikel 03.04.2011, 01:03
  • 4
    Да на Xubuntu bash, это не встроенное и не имеет --skip-alias опция. –  polym 31.07.2014, 18:43
  • 5
    На CentOS (и RHEL?) 6, это - исполняемый файл /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

Для разрешения вложенных псевдонимов (вручную) см. Разрешение вложенных псевдонимов их исходным командам

5
27.01.2020, 19:31

Другая альтернатива - команда vim, которая работает одинаково и в zsh, и в bash

Например, на моем mac:

LOLcalhost :: ~ % command which grep
/usr/local/bin/grep
0
27.01.2020, 19:31

Mine определен как таковой

alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde'
2
27.01.2020, 19:31

И type, и whichведут себя по-разному в зависимости от типа вашей оболочки.

В bash which— это команда, существующая в PATH. Он ищет команду, указанную вами в PATH. Встроенный Bashtype -P(P дляPATH)ведет себя точно так же, как which.

В ZSH как which, так и typeявляются встроенными и частичными функциями встроенного whence. which -pэто то, что вы хотите. Это заставляет искать путь. Опция(-Pнедоступна для typeZSH.)

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.

Чтобы пропуститьbuiltinwhichи принудительно использовать команду whichиз PATHв ZSH:

alias which="command which"
0
27.01.2020, 19:31

Теги

Похожие вопросы