Como determinar qual executável no meu caminho será executado?

3

Eu corro which e obtenho o seguinte,

brendan$ which python
  /opt/local/bin/python
brendan$ which -a python
  /opt/local/bin/python
  /usr/bin/python
brendan$ ls -l /opt/local/bin/python
  lrwxr-xr-x  1 root  admin  24 22 Jul 00:45 /opt/local/bin/python -> /opt/local/bin/python2.4
brendan$ python
  Python 2.6.1 (r261:67515, Jun 24 2010, 21:47:49) 
  ...
  (this is the python version in /usr/local/bin)

Meu ponto é, which não me diz o executável principal, ou seja, aquele que será executado de preferência. Como eu descubro isso?

Estou executando o OSX 10.6 em um Macbook, embora a questão seja geral para os gostos do UNIX.

Atualização: Eu removi muitas versões redundantes do Python no meu sistema (tive pelo menos meia dúzia) e removi várias declarações PATH do crufty em vários arquivos de inicialização. No processo, de alguma forma, um novo shell agora mostra a saída esperada (por exemplo, which mostra /opt/local/bin/python e é isso que é executado). De qualquer forma, obrigado pela ajuda!

    
por Brendan 22.07.2011 / 02:00

3 respostas

7

O que obtém a saída quando você executa which sem -a é aquele que será executado. (e o segundo com -a é o preferido em relação ao terceiro).

Isso não leva em consideração os builtins, aliases e funções do shell que serão executados (a partir do shell) antes de qualquer outro executável.

Portanto, é melhor usar type .

    
por 22.07.2011 / 02:12
4

O que mostra apenas which python é o que seu console usará, a menos que você tenha alias de Python para outra coisa ( alias python='/usr/bin/python' ).

    
por 22.07.2011 / 02:10
1

De acordo com a qual man page, which procura componentes da variável PATH usando o mesmo algoritmo do bash , ou seja, cada componente do PATH é pesquisado por sua vez. Então, como você observou, o que (sem o -a ) mostrará a primeira correspondência encontrada no PATH.

Seu exemplo é um pouco peculiar naquilo que retorna o que não seria o "executável principal", já que a primeira correspondência é um link simbólico. Não há referência a links simbólicos na página de manual do which , então estou assumindo que não pode ser feito para segui-los e revelar o alvo deles.

    
por 22.07.2011 / 02:18