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.

Kontinuum
quelle
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.

Stéphane Chazelas
quelle
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.

michael - mlc
quelle