Unter welchen Umständen wird die zuerst im Pfad gefundene ausführbare Datei nicht verwendet


15

Ich habe ein seltsames Verhalten mit zsh (5.4.2_1 installiert mit Homebrew) auf osx, das nicht das erste Auftreten einer ausführbaren Datei im Pfad verwendet.

Hier ist das Szenario:

echo $PATH kehrt zurück:

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

Brauen ist in beiden

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

und

usr/local/bin/brew

Dies wird dadurch bestätigt, dass ausgeführt wird, welches -a Gebräu welches zurückgibt:

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

Aber wenn ich laufen lasse, welches Gebräu es zurückbringt:

/usr/local/bin/brew

und brauen läuft /usr/local/bin/breweher als/usr/local/Cellar/zplug/HEAD-9fdb388/bin/brew

Wie kann das passieren, wenn das Brauen früher im Weg ist?

Hilfe geschätzt.


7
rehashund starte sie erneut - wenn es danach immer noch passiert, bearbeite das in.
Michael Homer

@MichaelHomer: Ja, das ist der eine. Erleben Sie hier.
Joshua

Antworten:


25

which -a cmdsucht nach allen regulären Dateien mit dem Namen, für cmddie Sie Ausführungsberechtigung haben, in den Verzeichnissen in $path(zusätzlich zu Aliasen, Funktionen, eingebauten ...).

While which cmdgibt den Befehl zurück, der ausgeführt werden zshwürde ( whichist zshwie in den tcshmeisten anderen Shells eingebaut, aber nicht so).

zshWie die meisten anderen Shells speichert sie die Pfade der ausführbaren Dateien in einer hashTabelle, damit sie nicht bei $pathjedem Aufruf in allen Verzeichnissen nachgeschlagen werden müssen.

Diese Hash-Tabelle (die im $commandsassoziativen Array in verfügbar gemacht wird zsh) kann mit dem hashBefehl (Standard-POSIX-Shell-Befehl) bearbeitet werden.

Wenn Sie den brewBefehl ausgeführt haben (oder which/type/whence brewdie Befehlsvervollständigung verwendet haben oder irgendetwas, das diesen Hash / Cache vorbereitet hätte), bevor er hinzugefügt wurde /usr/local/Cellar/zplug/HEAD-9fdb388/binoder bevor er /usr/local/Cellar/zplug/HEAD-9fdb388/binhinzugefügt wurde $path, zshhätten Sie sich an seinen Pfad erinnert und ihn als gespeichert $commands[brew]=/usr/local/bin/brew.

In diesem Fall können Sie hash -r(wie in der Bourne-Shell) oder rehash(wie in csh) die gespeicherten Befehle zsh vergessen haben (diesen Cache ungültig machen ), damit er das nächste Mal nachschlagen und ihn am neuen Speicherort finden kann.


Danke - das hat das Problem gelöst. Soll ich $ command [brew] ausgeben können - sehe ich nichts?
Kontinuum

1
@continuum, sorry, meine schlechte, das $commandsist nicht $command. Siehe Bearbeiten.
Stéphane Chazelas

0

/usr/local/bin/brew ist in der Regel ein symbolischer Link.

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

sind wahrscheinlich die gleichen Dateien.

Art:

ls -al /usr/local/bin/brew

bestätigen.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.