Em que circunstâncias o primeiro executável encontrado no caminho não será usado

14

Estou tendo um comportamento estranho com o zsh (5.4.2_1 instalado com o 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

brew está em ambos

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

e

usr/local/bin/brew

Isso é confirmado pela execução de , que é uma fermentação que retorna:

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

Mas quando eu corro , o que retorna:

/usr/local/bin/brew

e brew executam /usr/local/bin/brew em vez de /usr/local/Cellar/zplug/HEAD-9fdb388/bin/brew

Como isso pode acontecer quando a bebida está no início do caminho?

Ajuda apreciada.

    
por continuum 05.12.2017 / 05:06

2 respostas

22

which -a cmd procura todos os arquivos regulares chamados cmd para os quais você tem permissão de execução nos diretórios em $path (além de aliases, funções, builtins ...).

Enquanto which cmd retorna o comando que zsh executaria ( which é embutido em zsh como em tcsh , mas diferente da maioria das outras shells).

zsh , como a maioria dos outros shells lembra os caminhos dos executáveis em uma tabela hash para não ter que procurá-los em todos os diretórios em $path cada vez que você invoca-los.

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

Se você executou o comando brew (ou which/type/whence brew , ou usou a conclusão de comando ou qualquer coisa que tenha preparado esse hash / cache) antes de ser adicionado a /usr/local/Cellar/zplug/HEAD-9fdb388/bin ou antes de /usr/local/Cellar/zplug/HEAD-9fdb388/bin ser adicionado a $path , zsh teria 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 em csh) para ter zsh esquecer os comandos lembrados (invalidar isso cache ), para que possa consultá-lo da próxima vez e encontrá-lo na nova localização.

    
por 05.12.2017 / 09:06
0

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

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

são provavelmente os mesmos arquivos.

tipo:

ls -al /usr/local/bin/brew

para confirmar.

    
por 05.12.2017 / 11:23

Tags