Jaka jest różnica między którym i gdzie


16

Jaka jest różnica między poleceniami powłoki wherea whichpoleceniami powłoki? Oto kilka przykładów

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

i

  ~  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)

również

  ~  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

Wydaje mi się, że robią to samo, co wbudowana powłoka, nie do końca pewna, co to różni się od polecenia?

Odpowiedzi:


11

zshjest jedną z nielicznych powłok (pozostałe są tcsh( whichnapisane jako cshskrypt dla cshużytkowników, który również miał swoje ograniczenia, tcshuczyniło ją wbudowanym jako ulepszenie)), gdzie whichrobi coś sensownego, ponieważ jest to wbudowana powłoka, ale w jakiś sposób ty lub twój system operacyjny (przez jakiś rcplik) przerwał go, zastępując go wywołaniem whichpolecenia systemowego, które nie może zrobić nic sensownego, ponieważ nie ma dostępu do stażystów powłoki, więc nie może wiedzieć, jak powłoka interpretuje nazwę polecenia .

W zsh, wszystko which, type, whencei wheresą wbudowane poleceń, które są używane, aby dowiedzieć się o tym, co są polecenia, ale z różnych wyjść. Wszystkie są tam z powodów historycznych, możesz uzyskać wszystkie ich zachowania z różnymi flagami do whencepolecenia.

Możesz uzyskać szczegółowe informacje na temat każdego z nich, uruchamiając:

info -f zsh --index-search=which

Lub wpisz info zsh, a następnie wyświetl indeks za pomocą ii wprowadź nazwę wbudowaną (uzupełnianie jest dostępne).

I unikaj używania /usr/bin/which. Nie ma w dzisiejszych czasach, gdzie skorupa , która which jest potrzebna. Jak mówi Timothy, użyj wbudowanego interfejsu, który udostępnia do tego powłoka. Większość muszle POSIX będą mieli typepolecenie, a można użyć command -v, aby tylko dostać ścieżkę polecenia (choć oba typei command -vsą opcjonalne w POSIX (ale nie Unix, a nie dłużej w LSB), są one dostępne w większości, jeśli nie wszystkich Pociski podobne do Bourne'a, z którymi prawdopodobnie się spotkasz).

(BTW, wygląda na to, że /usr/binpojawia się dwa razy w twoim $PATH, możesz dodać a typeset -U pathdo swojego ~/.zshrc)


2
Pojawiło się to również we wcześniejszym pytaniu. Aby rozszerzyć ten punkt, zawsze powinieneś używać wbudowanej komendy powłoki tam, gdzie ona istnieje. Więc w bash użyj „type” zamiast „which”.
Tim B

Doskonała odpowiedź i dzięki za tę wskazówkę.
nikhil
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.