Как и у большинства пользователей, у меня есть набор псевдонимов, чтобы задать набор флагов по умолчанию для часто используемых программ. Например,
alias vim='vim -X'
alias grep='grep -E'
alias ls='ls -G'
Проблема в том, что если я хочу использовать, which
чтобы увидеть, откуда поступает мой vim
/ grep
/ ls
/ etc, псевдоним мешает:
$ which vim
vim: aliased to vim -X
Это полезный вывод, но не то, что я ищу в этом случае; Я знаю, что vim
это псевдоним, vim -X
но я хочу знать, откуда это vim
исходит.
Если не считать временного определения псевдонима, чтобы я мог использовать which
его, есть ли простой способ which
«развернуть» псевдоним и запустить его самому?
Редактировать: Кажется, что which
это встроенная оболочка с различным поведением в разных оболочках. В Bash предложение SiegeX о --skip-alias
флаге работает; однако я на зш. Есть ли что-то подобное там?
vim
исходит , вы бы использовалиwhere vim
Ответы:
which
на самом деле это плохой способ делать такие вещи, так как он делает предположения о вашей среде на основе$SHELL
и файлах запуска (которые он считает), которые использует оболочка; Мало того, что он иногда ошибается, но вы не можете сказать, что он ведет себя иначе. (which
на моем Ubuntu 10.10 не понимает,--skip-alias
как упомянуто, например, @SiegeX.)type
использует текущую среду оболочки вместо того, чтобы тыкать в ваши файлы конфигурации, и может быть сказано игнорировать части этой среды, поэтому он показывает вам, что на самом деле произойдет вместо того, что произойдет в реконструкции вашей оболочки по умолчанию.В этом случае
type -P
будут обходиться любые псевдонимы или функции:Вы также можете попросить его снять все слои, по одному, и показать вам, что он найдет:
(Расширяя это из комментариев :)
Проблема в
which
том, что это обычно внешняя программа, а не встроенная оболочка, что означает, что она не может видеть ваши псевдонимы или функции и должна пытаться восстановить их из файлов запуска / конфигурации оболочки. (Если это встроенная оболочка, как она есть,zsh
но, по-видимому, нетbash
, она с большей вероятностью использует среду оболочки и делает правильные вещи.)type
это POSIX-совместимая команда, которая должна вести себя так, как если бы она была встроенной (то есть она должна использовать среду оболочки, из которой вызывается, включая локальные псевдонимы и функции), поэтому обычно она является встроенной.Обычно его нет в
csh
/tcsh
, хотя в большинстве современных версийwhich
он встроен в оболочку и делает все правильно; иногдаwhat
вместо этого встроенный , а иногда нет никакого хорошего способа увидеть текущую среду оболочки изcsh
/tcsh
вообще.источник
type -a
кажется, возвращает все экземпляры на вашем$PATH
, а не только первый. Я думаю , что я буду псевдонимwhich
дляtype
:)type
это часть стандарта POSIX, то это путь. Чтобы ответить на мой вопрос, тип работает и на zsh (на Debian). Почему дистрибутивы не избавляютсяwhat
иwhich
если они не стандартизированы и не имеют дополнительной функциональности?info bash 'Bash builtins'
Linux, хотя вы также можете найти ее вzsh
справочном руководстве. Более официально, pubs.opengroup.org/onlinepubs/009695399/utilities/type.html (который я отмечаю, на самом деле не специфицируется-P
или-a
, или даже-p
является оригинальной формой-P
, но требует использования текущей среды оболочки).type -p
ведет себя по-разному между Zsh и Bash.type -P
вообще не существует в зш.В
bash
:В
zsh
:В обоих:
Или же:
источник
В zsh
which
есть встроенная команда:Чтобы выполнить внешнюю команду (в любой оболочке)
which
, используйте полный путь :таким образом, команда
ls
была найдена (значение выхода 0) и расположена в/bin/ls
.Внутри
zsh
; способ (помимо приведенного выше) для поиска внешних команд :Однако это не разрешит вложенные псевдонимы, такие как:
Команда сообщит, что
dire
команда не найдена.Для разрешения вложенных псевдонимов (вручную) см.
Resolve nested aliases to their source commands
источник
Шахта определена как таковая
источник
Попробуйте следующее:
источник
which
на самом деле это встроенная оболочка, а не обычная утилита Unix, как я предполагал. Поэтому я должен отредактировать свой вопрос и указать Zsh. Спасибо, что указал мне на это!which
не является встроенным, по крайней мере, в Debian. Это сценарий оболочки и часть debianutils, поэтому работает на zsh. Тем--skip-alias
не менее, это не вариантwhich
на Debian. Существуют ли различные вариантыwhich
плавания вокруг? Это не похоже на стандартизированную команду.man zshbuiltins
. имя которого [-wpams] ... Эквивалентно откуда -c.bash
, это не встроенный и не имеет--skip-alias
возможности./usr/bin/which
плюс псевдоним,/etc/profile.d
который позволяет обрабатывать псевдонимы, но--skip-alias
работает. В результатеwhich which
показывает псевдоним, ноcommand which which
показывает исполняемый файл!Другой альтернативой является
command which vim
, которая работает так же, как вzsh
иbash
Например, на моем Mac:
источник
Оба
type
иwhich
ведут себя по-разному в зависимости от типа вашей оболочки.В bash
which
команда существует вPATH
. Он ищет команду, которую вы указалиPATH
. Встроенный Bashtype -P
(P дляPATH
) ведет себя так же, какwhich
.В ZSH
which
иtype
есть встроенные функции, и частичные функции встроенныхwhence
.which -p
это то, что вы хотите. Это заставляет поиск пути. (-P
опция недоступна дляtype
ZSH.)Больше из руководства ZSH.
Чтобы пропустить
builtin
which
и принудительно использовать командуwhich
изPATH
ZSH:источник