Sob quais circunstâncias o executável encontrado pela primeira vez no caminho não será usado

15

Estou tendo algum comportamento estranho com o zsh (5.4.2_1 instalado com homebrew) no osx, não usando a primeira ocorrência de um executável no caminho.

Aqui está o cenário:

echo $PATH retorna:

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

fermentação está em ambos

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

e

usr/local/bin/brew

Isso é confirmado executando o comando -a brew que retorna:

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

Mas quando eu corro qual fermentação ela retorna:

/usr/local/bin/brew

e fermentação é executado em /usr/local/bin/brewvez de/usr/local/Cellar/zplug/HEAD-9fdb388/bin/brew

Como isso pode acontecer quando a fermentação está mais adiantada no caminho?

Ajuda apreciada.

continuum
fonte
7
rehashe execute-os novamente - se isso ainda acontecer depois, edite isso em. #
Michael Homer
@ MichaelHomer: Sim, é esse. Experimente aqui.
Joshua

Respostas:

25

which -a cmdprocura por todos os arquivos regulares nomeados para os cmdquais você tem permissão de execução nos diretórios $path(além de aliases, funções, componentes internos ...).

While which cmdretorna o comando que zshseria executado ( whiché um componente interno zshsemelhante ao tcshmas diferente da maioria dos outros shells).

zsh, como a maioria dos outros shells, lembra os caminhos dos executáveis ​​em uma hashtabela para não precisar procurá-los em todos os diretórios a $pathcada vez que você os invoca.

Essa tabela de hash (exposta na $commandsmatriz associativa em zsh) pode ser manipulada com o hashcomando (comando de shell POSIX padrão).

Se você executou o brewcomando (ou which/type/whence brew, ou usou a conclusão do comando ou qualquer coisa que tenha preparado esse hash / cache) antes de ter sido adicionado /usr/local/Cellar/zplug/HEAD-9fdb388/binou /usr/local/Cellar/zplug/HEAD-9fdb388/binadicionado $path, zshteria lembrado seu caminho e armazenado como $commands[brew]=/usr/local/bin/brew.

Nesse caso, você pode usar hash -r(como no shell Bourne) ou rehash(como no csh) para zsh esquecer os comandos lembrados (invalidar esse cache ), para que ele possa procurar na próxima vez e encontrá-lo no novo local.

Stéphane Chazelas
fonte
Obrigado - isso resolveu o problema. Devo ser capaz de ecoar $ command [brew] - não vejo nada?
continuum
1
@ Continuum, desculpe, meu mal, isso $commandsnão é $command. Veja editar.
Stéphane Chazelas
0

/usr/local/bin/brew geralmente é um link simbólico.

Então /usr/local/bin/brewe /usr/local/Cellar/zplug/HEAD-9fdb388/bin/brew

provavelmente são os mesmos arquivos.

tipo:

ls -al /usr/local/bin/brew

confirmar.

michael - mlc
fonte