Dans quelles circonstances l'exécutable trouvé en premier dans le chemin ne sera-t-il pas utilisé

15

J'ai un comportement étrange avec zsh (5.4.2_1 installé avec homebrew) sur osx n'utilisant pas la première occurrence d'un exécutable dans le chemin.

Voici le scénario:

echo $PATH Retour:

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

l'infusion est à la fois

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

et

usr/local/bin/brew

Ceci est confirmé en lançant quel brassage -a qui renvoie:

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

Mais quand je lance quel breuvage il revient:

/usr/local/bin/brew

et l' infusion fonctionne /usr/local/bin/brewplutôt que/usr/local/Cellar/zplug/HEAD-9fdb388/bin/brew

Comment cela peut-il se produire lorsque l'infusion est plus tôt sur le chemin?

Aide appréciée.

continuum
la source
7
rehashet exécutez-les à nouveau - si cela se produit encore par la suite, modifiez -le.
Michael Homer
@MichaelHomer: Yup c'est celui-là. Expérience ici.
Joshua

Réponses:

25

which -a cmd recherche tous les fichiers réguliers nommés cmd lesquels vous disposez des droits d'exécution dans les répertoires $path(en plus des alias, fonctions, fonctions intégrées ...).

While which cmdrenvoie la commande qui zshs'exécuterait ( whichest une fonction intégrée zshcomme danstcsh mais contrairement à la plupart des autres shells).

zsh, comme la plupart des autres shells, se souvient des chemins des exécutables dans une hashtable afin de ne pas avoir à les rechercher dans tous les répertoires de$path chaque fois que vous les appelez.

Cette table de hachage (exposée dans le $commandstableau associatif dans zsh) peut être manipulée avec lehash commande (commande shell POSIX standard).

Si vous avez exécuté la brewcommande (ou which/type/whence brew, ou utilisé l'achèvement de la commande ou quoi que ce soit qui aurait amorcé ce hachage / cache) avant son ajout /usr/local/Cellar/zplug/HEAD-9fdb388/binou avant l' /usr/local/Cellar/zplug/HEAD-9fdb388/binajout $path, se zshserait souvenu de son chemin et l'avait stocké sous $commands[brew]=/usr/local/bin/brew.

Dans ce cas, vous pouvez utiliser hash -r(comme dans le shell Bourne) ou rehash(comme dans csh) pour avoir zsh oublié les commandes mémorisées (invalider ce cache ), afin qu'il puisse le rechercher la prochaine fois et le trouver dans le nouvel emplacement.

Stéphane Chazelas
la source
Merci - cela a réglé le problème. Dois-je pouvoir faire écho à $ command [brew] - je ne vois rien?
continuum
1
@continuum, désolé, ma mauvaise, ce n'est $commandspas le cas $command. Voir modifier.
Stéphane Chazelas
0

/usr/local/bin/brew est généralement un lien symbolique.

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

sont probablement les mêmes fichiers.

type:

ls -al /usr/local/bin/brew

confirmer.

michael - mlc
la source