Por que 'qual' dá resultado incorreto?

0

Estou executando em um shell do Ubuntu 12.04 o seguinte comando:

sudo bash -c "echo $PATH; which python"

que exibe algo como

/home/me/env/develop/bin:/usr/lib/lightdm/lightdm:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
/usr/bin/python

e o seguinte comando

ls /home/me/env/develop/bin

displys (entre outros)

python

De acordo com as páginas man , o comando which procura o executável especificado em todos os caminhos definidos em PATH . A página man não especifica estritamente a 'ordem' da pesquisa, mas geralmente vai do início ao fim da variável de ambiente PATH .

Agora, o caminho /home/me/env/develop/bin contém um executável python (modos definidos corretamente, não um link simbólico), que também é o primeiro caminho em PATH . Mas o comando which exibe um local completamente diferente!

Por que isso? Estou fazendo algo idiota? Tem magicamente a ver com sudo ? Isso é um bug?

    
por Alex 11.07.2013 / 11:20

1 resposta

2

Não é um bug. $PATH entre as aspas duplas é expandido pelo seu shell antes que bash -c o veja.

Isso significa que você executará:

sudo bash -c "echo /home/me/env/develop/bin:/usr/lib/lightdm/lightdm:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games; which python"

Teste pequeno:

$ foo="hello"
$ sudo bash -c "echo $foo"
hello

Para chegar à raiz do seu problema, execute:

sudo bash -c 'echo $PATH; which python'

Isso não expandirá $PATH antes.

Uma solução para seu problema de caminho seria definir o caminho em .bashrc em vez de .bash_profile - ou seja, se estiver assumindo corretamente que seu caminho está definido lá - para que ele seja carregado mesmo para não fazer login shells (como em bash -c ). Ou você executa bash -lc para executar um shell de login, que carregaria .bash_profile .

    
por 11.07.2013 / 11:30