web-dev-qa-db-ja.com

パスで最初に見つかった実行可能ファイルが使用されない状況

パスに最初に出現する実行可能ファイルを使用しないosxでzsh(5.4.2_1をhomebrewと共にインストール)を使用すると、奇妙な動作が発生します。

ここにシナリオがあります:

echo $PATHは次を返します:

/usr/local/Cellar/zplug/HEAD-9fdb388/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin

brewは両方にあります

/usr/local/Cellar/zplug/HEAD-9fdb388/bin     

そして

usr/local/bin/brew

これはwhich -a brewを実行して確認されます。

/usr/local/Cellar/zplug/HEAD-9fdb388/bin/brew   
/usr/local/bin/brew

しかし、実行するとbrewが返されます。

/usr/local/bin/brew

そしてbrew/usr/local/bin/brewではなく/usr/local/Cellar/zplug/HEAD-9fdb388/bin/brewを実行します

Brewがパスの早い段階にある場合、これはどのように起こりますか?

感謝します。

15
continuum

which -a cmdは、_cmdという名前のすべての通常ファイルを、$pathのディレクトリで(エイリアス、関数、組み込みに加えて)探します。

which cmdzshが実行するコマンドを返します(whichzshと同様にtcshに組み込まれていますが、他のほとんどのシェルとは異なります)。

zshは、他のほとんどのシェルと同様、hashテーブル内の実行可能ファイルのパスを記憶しているため、呼び出すたびに$path内のすべてのディレクトリを検索する必要がありません。

そのハッシュテーブル(zsh$commands連想配列で公開)は、hashコマンド(標準のPOSIXシェルコマンド)で操作できます。

which/type/whence brewに追加される前、または/usr/local/Cellar/zplug/HEAD-9fdb388/bin/usr/local/Cellar/zplug/HEAD-9fdb388/binに追加される前に、brewコマンド(または$path、またはコマンド補完またはそのハッシュ/キャッシュを準備するものを使用した)を実行した場合、zshはそのパスを記憶し、$commands[brew]=/usr/local/bin/brewとして保存します。

その場合、hash -r(Bourne Shellのように)またはrehash(cshのように)を使用してzshforget記憶されたコマンド(無効にする- cache)なので、次回それを検索して新しい場所で見つけることができます。

25

/usr/local/bin/brewは通常シンボリックリンクです。

そう - /usr/local/bin/brewおよび/usr/local/Cellar/zplug/HEAD-9fdb388/bin/brew

おそらく同じファイルです。

タイプ:

ls -al /usr/local/bin/brew

確認するために。

0
michael - mlc