Which ve where arasındaki fark nedir


16

whereVe whichshell komutları arasındaki fark nedir ? İşte bazı örnekler

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

ve

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

Ayrıca

  ~  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

Bana göre onlar aynı şeyi bir kabuk yerleşik olarak yapıyor gibi görünüyor, bunun bir komuttan nasıl farklı olduğundan emin değil misiniz?

Yanıtlar:


11

zshBirkaç kabukları biri (diğerleri ediliyor tcsh( whicha olarak ortaya cshiçin komutcshbir kabuk kabuğu olduğu için mantıklı bir şey kullanıcılar , bu da sınırlaması vardır, tcshbunu bir iyileştirme olarak yerleşik hale getirmiştir)) which, ancak bir şekilde siz veya işletim sisteminiz (bazı rcdosyalarla) whichkabuğun stajyerlerine erişimi olmadığı için sistem komutuna bir çağrı güvenilir bir şekilde yapamayan bir çağrı ile değiştirerek bozdu, bu yüzden kabuğun bir komut adını nasıl yorumladığını bilemez .

Zsh'de, hepsi which,type , whenceve wheretüm komutları ne hakkında bilgi edinmek için kullanılır komutları, yerleşik ancak farklı çıkışları ile vardır. Hepsi tarihsel bir nedenden dolayı oradalar, tüm davranışlarını whencekomuta farklı bayraklarla alabilirsiniz .

Her birinin çalışarak ne yaptığını öğrenebilirsiniz:

info -f zsh --index-search=which

Veya yazın info zsh , ardından dizini ile getirin ive yerleşik adını girin (tamamlama kullanılabilir).

Ve kullanmaktan kaçının /usr/bin/which. Bugünlerde bunun which gerekli olduğu bir kabuk yok . Timothy'in dediği gibi, kabuğunuzun sağladığı yerleşimi kullanın. Çoğu POSIX mermisi şu typekomuta sahip olacaktır ve şunları kullanabilirsiniz:command -v sadece (her ikisi olsa komutun yolunu almak typeve command -vhepsi değilse bile çoğu mevcuttur) LSB değil artık POSIX'deki (ancak Unix isteğe bağlıdır ve Hiç karşılaşmadığınız Bourne benzeri mermiler).

(Btw, bu gibi görünüyor /usr/binGözlerinde farklı iki kez göründüğünü $PATH, bir ekleyebilir typeset -U pathadresinden Müşteri ~/.zshrc)


2
Bu da daha önceki bir soruda ortaya çıktı. Bu noktayı genişletmek için, her zaman bir komut bulunan yerleşik bir kabuk kullanmalısınız. Yani bash'ta, "hang" yerine "type" kullanın.
Tim B

Mükemmel cevap ve bu ipucu için teşekkürler.
nikhil
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.