パスで最初に見つかった実行可能ファイルはどのような状況で使用されませんか


15

osxでzsh(homebrewでインストールされた5.4.2_1)で、パス内で最初に実行可能ファイルが使用されないという奇妙な動作があります。

シナリオは次のとおりです。

echo $PATH 戻り値:

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

醸造は両方にあります

/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

しかし、どの醸造を実行すると、それが返されます:

/usr/local/bin/brew

そしてbrewでは/usr/local/bin/brewなく/usr/local/Cellar/zplug/HEAD-9fdb388/bin/brew

brewがパスの初期にある場合、これはどのように発生しますか?

感謝します。


7
rehashそして再びそれらを実行します-それはまだ、その後発生した場合、編集をであること。
マイケル・ホーマー

@MichaelHomer:そうですね。ここで体験してください。
ジョシュア

回答:


25

which -a cmd(エイリアス、関数、ビルトインに加えて)のcmdディレクトリで実行権限を持っているすべての通常ファイルを探します$path

一方でwhich cmd返すコマンドzsh実行しますが(which中に組み込みでzshのようにtcshほとんどの他のシェルとは異なります)。

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

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

あなたが実行している場合はbrew、コマンド(あるいはwhich/type/whence brew、または使用されるコマンドの完了またはそのハッシュ/キャッシュをプライミングしていた何かを)それが追加される前/usr/local/Cellar/zplug/HEAD-9fdb388/binまたは前/usr/local/Cellar/zplug/HEAD-9fdb388/binに追加された$pathzshそのパスを思い出したとして、それを保存しているだろう$commands[brew]=/usr/local/bin/brew

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


ありがとう-これで問題は整理されました。$ command [brew]をエコーできるはずです-何も表示されませんか?
連続体

1
@continuum、すみません、私の悪い、それは$commands、ではありません$command。編集を参照してください。
ステファンシャゼル

0

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

だから、/usr/local/bin/brewおよび /usr/local/Cellar/zplug/HEAD-9fdb388/bin/brew

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

タイプ:

ls -al /usr/local/bin/brew

確認するために。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.