Como o Linux decide qual executável estou tentando executar?

1

Eu pensei que entendia isso, mas estou tendo um comportamento inexplicável. Eu tenho esses arquivos:

$ which -a kvm | xargs ls -l
lrwxrwxrwx 1 root root 18 2011-11-17 17:14 /usr/bin/kvm -> qemu-system-x86_64
lrwxrwxrwx 1 root root 18 2011-11-17 17:21 /usr/local/bin/kvm -> qemu-system-x86_64
$ which -a qemu-system-x86_64 | xargs ls -l
-rwxr-xr-x 1 root root 2535168 2011-10-04 02:44 /usr/bin/qemu-system-x86_64
-rwxr-xr-x 1 root root 3497304 2011-11-17 16:26 /usr/local/bin/qemu-system-x86_64

E são versões diferentes:

$ /usr/bin/kvm --version
QEMU PC emulator version 0.12.3 (qemu-kvm-0.12.3), Copyright (c) 2003-2008 Fabrice Bellard
$ /usr/local/bin/kvm --version
QEMU emulator version 0.15.92 (qemu-kvm-devel), Copyright (c) 2003-2008 Fabrice Bellard

Meu caminho tem /usr/local/bin primeiro e, quando eu faço which , vejo esse. Então eu espero que isso vença. Mas a versão mais antiga ganha:

$ echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/var/lib/gems/1.8/bin
$ which kvm
/usr/local/bin/kvm
$ kvm --version
QEMU PC emulator version 0.12.3 (qemu-kvm-0.12.3), Copyright (c) 2003-2008 Fabrice Bellard

Por que kvm --version me fornece 0,12 em vez de 0,15 ???

    
por Robert Martin 17.11.2011 / 23:27

2 respostas

7

O Linux não toma a decisão neste caso; é fornecido com o caminho exato pelo seu shell. Ao usar shells avançados como bash ou zsh , a ferramenta which é imprecisa, pois só verifica $ PATH, mas há várias outras possibilidades. A execução de type kvm deve informar onde o shell está procurando.

  • " hashed ": A primeira vez que você executa um comando, o shell bash lembra sua localização para que ele não precise pesquisar o $ PATH inteiro novamente. Os locais lembrados são mantidos apenas na memória. Use hash para listá-los e hash -r para redefinir ou simplesmente inicie uma segunda janela de shell.

  • " alias ": você pode ter criado um alias " kvm " apontando para o caminho antigo. Se esse for o caso, use unalias kvm para remover o alias.

  • " function ": semelhante aos aliases, mas mais expressivo. Novamente, é possível que você tenha adicionado e esquecido uma função chamada kvm apontando para o caminho errado. Use unset kvm para remover essa função.

por 17.11.2011 / 23:41
2

Você pode substituir a pesquisa PATH declarando um alias

alias kvm=/sbin/kvm

Experimente type -a kvm

Eu criei um alias para a data

$ which -a date
/usr/local/bin/date
/bin/date

$ type -a date
date is aliased to '/bin/date'
date is /usr/local/bin/date
date is /bin/date
    
por 17.11.2011 / 23:48

Tags