por que o shell usa executável em/usr/bin e não em/usr/local/bin

por que o shell usa executável em/usr/bin e não em/usr/local/bin

Dado:

/usr/local/bin/cmake
/usr/bin/cmake
$ cmake # runs /usr/bin/cmake

$ echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin

Por que isso e como faço para que o shell execute o executável /usr/local/bin/cmakequando digito cmake(sem aliases e similares)?

Responder1

O problema foi revelado executando

$ type -f cmake
cmake is hashed (/usr/bin/cmake)

E limpando o hash do bash com

hash -d cmake

Depois disso, cmakefoi interpretado conforme o esperado.

Responder2

Em algum momento anterior durante a mesma sessão de shell, você usou cmakee esse executável foi encontrado em /usr/bin.

Em seguida, você instalou outro cmakeexecutável em /usr/local/bin.

O bashshell armazena em cache o primeiro local encontrado para qualquer comando externo usado, o que significa que não é necessário fazer uma pesquisa cara pelo executável na próxima vez que você usar o mesmo comando. A desvantagem disso é que não vai se preocupar em olharde novoquando você, posteriormente, instalar outro executável com o mesmo nome, mesmo que isso seja feito em um diretório anterior $PATHao local original.

A solução para esse problema é esvaziar os locais em cache dos executáveis ​​que bashsão mantidos. Isso é feito com hash -r( rehashno zshshell). Para esquecer apenas a localização do cmakeexecutável, use hash -d cmake( unhash cmakeno zshshell).


Uma versão anterior desta questão também questionava por que os dois comandos type cmakederam which cmakeresultados diferentes, onde which cmakepareciam dar o resultado esperado ( /usr/local/bin/cmake) enquanto type cmakepareciam dar o resultado errado ( /usr/bin/cmake).

A resposta para isso é que typeé um comando interno que bashusará os mesmos locais de comandos em cache que o shell usa, e isso whichénãoum comando integrado e, portanto, não será capaz de usar esses locais de executáveis ​​em cache.

Neste caso, whichdeu o resultado esperado porque fez uma busca cmakeno seu $PATH, mas na verdade foi oerradoresultado, já que executar cmakena linha de comando seria de fatonãobuscá-lo /usr/local/bin(devido ao cache, que você whichnão teria conhecimento).

Um resumo da história whiche das armadilhas de seu uso pode ser encontrado aqui:Por que não usar "qual"? O que usar então?

informação relacionada