Meu comando 'which' pode estar errado (às vezes)?

15

Eu compilei a última versão do emacs a partir do código-fonte (v24.2) porque a versão instalada na minha máquina é (bastante) antiga para mim (v21.3). Eu fiz o usual:

$configure --prefix=$HOME
make 
make install

Agora estou testando o emacs e percebi que ele ainda lança a versão anterior ... enquanto meu caminho $HOME/bin deve substituir o do sistema (já que é anexado ao $ PATH no meu arquivo .bashrc ).

Meu primeiro pensamento foi ver a saída do comando which . E surpresa, dá o caminho para o novo emacs. Não consigo entender onde está a discrepância aqui. Na mesma sessão, aqui estão os diferentes resultados:

$ emacs --version
GNU Emacs 21.3.1

$ 'which emacs' --version
GNU Emacs 24.2.1

Eu não tenho apelidos envolvendo emacs. Em tudo.

$ alias | grep emacs
$

Alguma ideia do que está acontecendo, por favor?

    
por yves Baumes 06.09.2012 / 17:57

3 respostas

23

As três possibilidades que me vêm à mente:

  • Existe um alias para emacs (que você verificou)
  • Existe uma função para emacs
  • O novo binário emacs não está no hashtable PATH do seu shell.

Você pode verificar se tem uma função emacs :

bash-3.2$ declare -F | fgrep emacs
declare -f emacs

E remova-o:

unset -f emacs

Seu shell também tem um hashtable PATH que contém uma referência para cada binário em seu PATH. Se você adicionar um novo binário com o mesmo nome de um existente em outro lugar em seu PATH, o shell precisará ser informado atualizando o hashtable:

hash -r

Explicação adicional:

which não sabe sobre funções, pois não é um bash embutido:

bash-3.2$ emacs() { echo 'no emacs for you'; }
bash-3.2$ emacs
no emacs for you
bash-3.2$ which emacs
/usr/bin/emacs
bash-3.2$ 'which emacs' --version | head -1
GNU Emacs 22.1.1

Novo comportamento de hash binário é demonstrado por esse script.

bash-3.2$ PATH=$HOME/bin:$PATH
bash-3.2$ cd $HOME/bin

bash-3.2$ cat nofile
cat: nofile: No such file or directory
bash-3.2$ echo echo hi > cat
bash-3.2$ chmod +x cat
bash-3.2$ cat nofile
cat: nofile: No such file or directory

bash-3.2$ hash -r
bash-3.2$ cat nofile
hi
bash-3.2$ rm cat
bash-3.2$ cat nofile
bash: /Users/mrb/bin/cat: No such file or directory

bash-3.2$ hash -r
bash-3.2$ cat nofile
cat: nofile: No such file or directory

Embora eu não tenha chamado, which cat sempre retornaria o primeiro cat no meu PATH, porque ele não usa o hashtable do shell.

    
por 06.09.2012 / 18:28
9

Sim, não use quais :

  • Em alguns sistemas, é um comando externo implementado como um script csh, que pode ler uma configuração que altera o PATH .
  • Há um built-in para isso. Dois, até: type e command . A maneira POSIX:

    command -v emacs       # machine-readable format
    type emacs             # human-only format
    

    No bash, você também pode usar type -p emacs para ver apenas o caminho de um comando externo.

No entanto, aqui, which está correto. Bash mantém informações sobre a localização de um comando na memória, para que ele possa executar o comando mais rapidamente na próxima vez. Você instalou um novo executável emacs no seu PATH , mas o bash ainda tem o local antigo em seu cache. Execute hash emacs para procurar emacs novamente ou hash -r para esvaziar o cache.

    
por 07.09.2012 / 00:32
1

Você fez logout e login para fazer com que seu arquivo de login .bashrc atualizado fosse relido? Caso contrário, o ambiente da sua sessão atual não foi atualizado.

    
por 06.09.2012 / 19:36