Apa perbedaan antara yang mana dan di mana

16

Apa perbedaan antara perintah shell wheredan which? Berikut ini beberapa contohnya

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

dan

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

juga

  ~  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

Bagi saya tampaknya mereka melakukan hal yang sama dengan menjadi builtin shell, tidak yakin bagaimana itu berbeda dari sebuah perintah?

nikhil
sumber

Jawaban:

11

zshadalah salah satu dari beberapa shell (yang lain sedang tcsh( whichberasal sebagai cshskrip untuk cshpengguna, yang juga memiliki keterbatasan, tcshmenjadikannya builtin sebagai peningkatan)) di mana whichmelakukan sesuatu yang masuk akal karena itu adalah shell builtin, tetapi entah bagaimana Anda atau OS Anda (via beberapa rcfile) memecahkannya dengan menggantinya dengan panggilan ke whichperintah sistem yang tidak dapat melakukan apa pun yang masuk akal karena tidak memiliki akses ke magang shell sehingga tidak bisa tahu bagaimana shell menginterpretasikan nama perintah .

Dalam zsh, semua which, type, whencedan whereadalah builtin perintah yang semua digunakan untuk mencari tahu tentang apa perintah yang, tetapi dengan output yang berbeda. Mereka semua ada karena alasan historis, Anda bisa mendapatkan semua perilaku mereka dengan bendera yang berbeda pada whenceperintah.

Anda bisa mendapatkan detail tentang apa yang masing-masing lakukan dengan menjalankan:

info -f zsh --index-search=which

Atau ketik info zsh, lalu bawa indeks dengan i, dan masukkan nama builtin (selesai tersedia).

Dan hindari menggunakan /usr/bin/which. Tidak ada shell saat ini di mana itu which diperlukan. Seperti yang dikatakan Timothy, gunakan builtin yang disediakan oleh shell Anda untuk itu. Sebagian besar shell POSIX akan memiliki typeperintah, dan Anda dapat menggunakan command -vhanya untuk mendapatkan path dari sebuah perintah (meskipun keduanya typedan command -vopsional di POSIX (tetapi tidak Unix, dan tidak lagi di LSB), mereka tersedia di sebagian besar jika tidak semua Kerang mirip Bourne yang kemungkinan besar pernah Anda temui).

(BTW, sepertinya /usr/binmuncul dua kali di Anda $PATH, Anda dapat menambahkan typeset -U pathke Anda ~/.zshrc)

Stéphane Chazelas
sumber
2
Ini muncul dalam pertanyaan sebelumnya juga. Untuk memperluas titik ini, Anda harus selalu menggunakan perintah built-in shell di mana ada. Jadi dalam bash, gunakan "ketik" bukan "yang".
Tim B
Jawaban dan terima kasih yang luar biasa untuk tip itu juga.
nikhil