Як використовувати `what` для псевдонімна команда?


76

Як і більшість користувачів, у мене є купа псевдонімів, створених для надання набору прапорів за замовчуванням для часто використовуваних програм. Наприклад,

alias vim='vim -X'
alias grep='grep -E'
alias ls='ls -G'

Проблема полягає в тому, що якщо я хочу використати, whichщоб побачити, звідки походить мій vim/ grep/ ls/ тощо, псевдонім заважає:

$ which vim
vim: aliased to vim -X

Це корисний вихід, але не те, що я шукаю в цьому випадку; Я знаю , що vimце псевдонім , vim -Xале я хочу знати , де що vim звідки.

Не whichмаючи тимчасового не визначити псевдонім лише для того, щоб я міг його використовувати , чи є простий спосіб which"розкрутити" псевдонім і запустити себе на ньому?

Редагувати: Здається, whichце оболонка з різною поведінкою в різних оболонках. В Bash, пропозиція SiegeX про --skip-aliasпрапор працює; проте я на Zsh. Чи існує щось подібне там?


в zsh, якщо ви хочете дізнатися, звідки vimце походить , ви користуєтесьwhere vim
Matija Nalis

Відповіді:


105

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взагалі.


6
Дякую! Це щось дуже корисне, щоб додати до моєї сумки хитрощів. Мені особливо подобається, що, type -aздається, повертаються всі екземпляри на вашому $PATH, а не лише перший. Я думаю , що я буду псевдонім whichдля type:)
Адріан Петреску

2
@ geekosaur: Дякую Якщо typeє частиною стандарту POSIX, тоді це шлях. Щоб відповісти на моє запитання, введіть твори також на zsh (на Debian). Чому не розповсюджуються дистрибутиви, whatі whichякщо вони не стандартизовані і не мають додаткової функціональності?
Faheem Mitha

1
Ні, навіть віддалено.
geekosaur

1
@Faheem: повторну документацію, я б розпочав з info bash 'Bash builtins'Linux, хоча ви також можете отримати її з zshпосібника. Більш офіційно, pubs.opengroup.org/onlinepubs/009695399/utilities/type.html (що, зауважу, насправді не є специфікацією -Pабо -a, навіть, -pяка була первісною формою -P, але вимагає використання цього поточного середовища оболонки).
geekosaur

2
type -pповодиться по-різному між zsh і bash. type -Pвзагалі не існує в zsh.
kojiro

15

В bash:

type -P vim

В zsh:

type -p vim

В обох:

/usr/bin/which vim

Або:

( unalias vim; type vim )

2
Останній класний. У нас може бути псевдонім для цього. :)
balki

У bash на redhat я повинен використовувати тип -P, а не який, якщо я хочу правильну відповідь. Ніяких псевдонімів чи функцій не стосується.

Д-р Еваль, який "який"? Яка Червона Шапочка?
Мікель

@Mikel RH7.4. GNU який v2.20.

4

У zsh whichє вбудований, як повідомляє ця команда:

$ whence -w which
which: builtin

Для виконання зовнішньої команди (у будь-якій оболонці) whichвикористовуйте Повний шлях :

$ /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

Про вирішення вкладених псевдонімів (вручну) див Resolve nested aliases to their source commands


2

Шахта визначена як така

alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde'

1

Спробуйте наступне:

which --skip-alias vim

1
Цікаво! Це працює на Bash, але не на Zsh (я дійсно не думав, що це буде залежно від оболонки). Це дало мені зрозуміти, що whichнасправді вбудована оболонка, а не звичайна утиліта Unix, як я припускав. Тому я повинен відредагувати своє запитання та вказати Zsh. Дякую, що вказали на це!
Адріан Петреску

whichне є вбудованим, принаймні не на Debian. Це сценарій оболонки і частина debianutils, тому працює на zsh. Однак --skip-aliasце не варіант whichна Debian. Чи існують різні різновиди whichплаваючих навколо? Це не є стандартизованою командою.
Faheem Mitha

@Faheem Mitha: Це zsh вбудований. Див man zshbuiltins. яке [-wpams] назва ... еквівалентно, звідки -c.
Мікель

Так на Xubuntu bash, це не вбудований і не має --skip-aliasможливості.
полим

У CentOS (і RHEL?) 6 це виконавчий /usr/bin/whichдодаток плюс псевдонім, /etc/profile.dякий дозволяє йому обробляти псевдоніми, але --skip-aliasпрацює. В результаті which whichпоказується псевдонім, але command which whichпоказує виконуваний файл!
dave_thompson_085

0

Ще одна альтернатива - це те command which vim, що працює однаково і в zshіbash

Наприклад, на моєму комп'ютері:

LOLcalhost :: ~ % command which grep
/usr/local/bin/grep

Ах досить справедливо.
Зеє Олександр

0

І те, typeі whichінше поводяться по-різному відповідно до вашого типу оболонки.

У bash, whichє команда існує в PATH. Він здійснює пошук команди, яку ви вводите PATH. Bash buildin type -P(P for PATH) поводиться точно так само which.

У ZSH є whichі typeвбудовані, і часткові функції вбудованих whence. which -pце те, що ти хочеш. Це змушує шукати шлях. ( -Pопція недоступна для typeZSH.)

звідки ім'я [-vcwfpamsS] [-x num] ...

-п

Проведіть пошук імені, навіть якщо це псевдонім, зарезервоване слово, функція оболонки або вбудований.

Більше з посібника ZSH.

яке [-wpamsS] [-x num] ім'я ...

Рівнозначно, звідки -c.

Щоб пропустити builtin whichта примусити використовувати команду whichз PATHу ZSH:

alias which="command which"
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.