
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/cmake
quando 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, cmake
foi interpretado conforme o esperado.
Responder2
Em algum momento anterior durante a mesma sessão de shell, você usou cmake
e esse executável foi encontrado em /usr/bin
.
Em seguida, você instalou outro cmake
executável em /usr/local/bin
.
O bash
shell 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 $PATH
ao local original.
A solução para esse problema é esvaziar os locais em cache dos executáveis que bash
são mantidos. Isso é feito com hash -r
( rehash
no zsh
shell). Para esquecer apenas a localização do cmake
executável, use hash -d cmake
( unhash cmake
no zsh
shell).
Uma versão anterior desta questão também questionava por que os dois comandos type cmake
deram which cmake
resultados diferentes, onde which cmake
pareciam dar o resultado esperado ( /usr/local/bin/cmake
) enquanto type cmake
pareciam dar o resultado errado ( /usr/bin/cmake
).
A resposta para isso é que type
é um comando interno que bash
usará 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, which
deu o resultado esperado porque fez uma busca cmake
no seu $PATH
, mas na verdade foi oerradoresultado, já que executar cmake
na linha de comando seria de fatonãobuscá-lo /usr/local/bin
(devido ao cache, que você which
não teria conhecimento).
Um resumo da história which
e das armadilhas de seu uso pode ser encontrado aqui:Por que não usar "qual"? O que usar então?