これらのwhichとwhereの違いは何ですか?

これらのwhichとwhereの違いは何ですか?

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

私にとって、彼らは同じことをするようです。一つは組み込みシェルです。これがコマンドとどう違うのかよくわかりません。

答え1

zshシェルに組み込まれているため、いくつかの合理的なタスクを実行する数少ないシェルの1つです(他のシェルはtcshwhich元のユーザーcshスクリプトとしてcshtcsh改良として組み込まれる制限もあります))、whichまたはOS(一部のrcファイルを介して)がシェルのインターンにアクセスできないため、合理的な操作を確実に実行できないシステムコマンドへの呼び出しで置き換えることで、これを壊しましたwhich。したがって、シェルがどのように機能するかを知る方法はありません。コマンド名を解釈します。

zshでは、すべてwhichtypewhenceそしてwhere組み込みコマンドはどちらもコマンドが何であるかを見つけるために使用されますが、出力は異なります。それらはすべて歴史的な理由で存在し、他のフラグを使用してすべての動作を取得できます。whence注文する。

次のコマンドを実行すると、各関数の詳細を確認できます。

info zsh which
info zsh whence
...

または を入力info zshした後、 でインデックスを呼び出し、組み込みi名を入力します(可能)。

今それを使用しないでください/usr/bin/whichそれ which必要です。 Timothyが言ったように、シェルが提供する組み込み機能を使用してください。ほとんどのPOSIXシェルにはこのコマンドがあり、コマンドへのパスを取得するためtypeにのみ使用できます。 (および両方ともPOSIXではオプションですが(UnixではなくLSBではなく)、ほとんどの場合使用できます。Bourneのようなシェル)。command -vtypecommand -v

(ところで、あなたのアイテムに2回現れるようです。あなたのアイテムに追加することが/usr/binできます。)$PATHtypeset -U path~/.zshrc

答え2

違い1:

良い機能の違いに言及したい私はあなたの質問自体で観察しました:

which渡されたパラメータを持つ最初のパスが一覧表示されます。

whereすべてのパスが一覧表示され、渡されたパラメータを見つけます。

例えば

 ~ which tree
/bin/tree
 ~ where tree
/bin/tree
/usr/bin/tree

違い2:

whereUnixだけでなくWindowsでも同様です。

関連情報