Яка різниця між тим, де і де


16

У чому різниця між командами whereта whichоболонками? Ось кілька прикладів

 ~  where cc
/usr/bin/cc
/usr/bin/cc
~  which cc
/usr/bin/cc

і

  ~  which which
which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde'
/usr/bin/which
  ~  which where
/usr/bin/which: no where in (/usr/local/bin:/bin:/usr/bin:/home/bnikhil/bin:/bin)

також

  ~  where which
which: aliased to alias | /usr/bin/which --tty-only --read-alias --show-dot
 --show-tilde
which: shell built-in command
/usr/bin/which
/usr/bin/which
  ~  where where
where: shell built-in command

Мені здається, що вони роблять те саме, що є оболонкою, не зовсім впевненою, чим це відрізняється від команди?

Відповіді:


11

zshє однією з небагатьох оболонок (інша історія tcsh( whichстворена як cshсценарій для cshкористувачів, яка також мала обмеження, tcshзробила це вбудованим як покращення)), де whichробиться щось розумне, оскільки це вбудована оболонка, але якимось чином ви або ваша ОС (через якийсь rcфайл) зламав його, замінивши його викликом до системної whichкоманди, яка не може зробити щось надійне надійно, оскільки не має доступу до інтернів оболонки, тому не може знати, як ця оболонка інтерпретує ім'я команди .

У Zsh, все which, type, whenceі whereє вбудованими командами, які все використовуються , щоб дізнатися про те, що команди, але з різними виходами. Вони все там з історичної причини, ви можете передати whenceкоманду всі їх поведінки з різними прапорами .

Ви можете отримати детальну інформацію про те, що кожен робить, запустивши:

info -f zsh --index-search=which

Або введіть info zsh, а потім підберіть індекс iі введіть вбудовану назву (завершення доступне).

І уникайте використання /usr/bin/which. Там немає оболонки в наш час , коли , що which необхідно. Як каже Тимофій, використовуйте вбудований, який надає ваша оболонка для цього. Більшість оболонок POSIX матимуть typeкоманду, і ви можете використовувати command -vлише для отримання шляху команди (хоча обидва typeі command -vє додатковими в POSIX (але не Unix і не більше в LSB), вони доступні в більшості, якщо не у всіх Борнові снаряди, які ви, швидше за все, коли-небудь натрапите).

(BTW, схоже, /usr/binз’являється двічі у вашому $PATH, ви можете додати typeset -U pathсвій ~/.zshrc)


2
Це також виникало в попередньому питанні. Щоб розширити цю точку, ви завжди повинні використовувати оболонку, вбудовану в команду там, де така існує. Тож у bash використовуйте "type" замість "what".
Тім Б

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