Configurando variáveis de ambiente com .bash_profile: somente a última exportação funciona corretamente

2

Estou tentando exportar algumas variáveis de ambiente no Unix usando .bash_profile

Agora lê assim:

export PATH=${PATH}:/usr/local/cuda-6.0/bin/
export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:/usr/local/cuda-6.0/targets/x86_64-linux/lib/

Depois disso, tento executar um script python que usa essas variáveis

python
>>> import theano

E eu recebo este erro:

ERROR (theano.sandbox.cuda): nvcc compiler not found on $PATH. Check your nvcc installation and try again.

Depois eu saio do python, executo novamente manualmente a primeira linha do .bash_profile e ele funciona.

Se eu alterar a ordem das exportações assim:

export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:/usr/local/cuda-6.0/targets/x86_64-linux/lib/
export PATH=${PATH}:/usr/local/cuda-6.0/bin/

E tente mais uma vez importar o theano do python Eu recebo este erro:

ERROR (theano.sandbox.cuda): Failed to compile cuda_ndarray.cu: libcublas.so.6.0: cannot open shared object file: No such file or directory
WARNING (theano.sandbox.cuda): CUDA is installed, but device gpu is not available  (error: cuda unavilable)

O que indica que export LD_LIBRARY_PATH não funcionou. Eu faço o mesmo procedimento de antes, o Python de saída executa novamente a primeira linha e depois importa corretamente.

Adicionar a primeira exportação à última linha do script bash (exportar duas vezes) faz com que essa primeira / terceira exportação funcione bem, mas não a segunda, ou seja, somente a última exportação está funcionando corretamente.

Eu tentei executar comandos de eco nas variáveis e ele estava imprimindo normalmente como se elas estivessem corretamente definidas, mas não consigo usá-las com o python. Além disso, ao redefini-las manualmente, isso não as duplica, mas a redefinição de configurações é:

-bash-4.2$ echo $LD_LIBRARY_PATH
:/usr/local/cuda-6.0/targets/x86_64-linux/lib/
-bash-4.2$ export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:/usr/local/cuda-6.0/targets/x86_64-linux/lib/
-bash-4.2$ echo $LD_LIBRARY_PATH
:/usr/local/cuda-6.0/targets/x86_64-linux/lib/
-bash-4.2$ export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:/usr/local/cuda-6.0/targets/x86_64-linux/lib/
-bash-4.2$ echo $LD_LIBRARY_PATH
:/usr/local/cuda-6.0/targets/x86_64-linux/lib/:/usr/local/cuda-6.0/targets/x86_64-linux/lib/

Na verdade, resolvi esse problema redefinindo a variável PATH dentro do script python, mas me incomoda não encontrar o motivo pelo qual isso está acontecendo

Algumas informações:

-bash-4.2$ bash --version
GNU bash, version 4.2.53(1)-release (x86_64-redhat-linux-gnu)
-bash-4.2$ cat /etc/*-release
Fedora release 19 (Schrödinger’s Cat)
    
por gsmafra 07.05.2015 / 16:15

2 respostas

3

Eu vejo na minha bola de cristal que você está editando o arquivo em uma máquina Windows.

O Windows e o Linux têm maneiras diferentes de representar quebras de linha. No Linux (como em qualquer sistema unix), uma linha consiste em uma série de caracteres que termina com um caractere de alimentação de linha (LF = \n = Ctrl + J). No Windows, as linhas são separadas por uma sequência de dois caracteres: retorno de carro e, em seguida, avanço de linha (CRLF = \r\n = Ctrl + M Ctrl + J).

Seu arquivo contém o comando export PATH=… , depois CR, LF e o comando export LD_LIBRARY_PATH sem nenhuma nova linha no final. Para programas Linux, a mesma sequência de bytes representa export PATH=… com um caractere CR no final, depois uma quebra de linha e, em seguida, uma linha inacabada contendo export PATH=… . Seu shell executa fielmente o primeiro comando, que adiciona um diretório a PATH com um nome que termina em um caractere CR. Como não há diretório com esse nome, a alteração de PATH não tem efeito. Em seguida, o shell trata a linha parcial como se fosse uma linha completa, que é o comando pretendido para definir LD_LIBRARY_PATH .

Quando você anexou o diretório pela segunda vez, você não digitou um caractere CR no comando, então o comando funcionou. Quando você exibiu a saída, o caractere CR foi interpretado pelo terminal para significar “voltar ao início da linha”. Já que você tinha exatamente o mesmo conteúdo antes e depois do caractere CR, isso pareceu imprimir esse conteúdo uma vez - na verdade, ele foi impresso duas vezes na mesma posição.

Edite seus arquivos de configuração do Linux no Linux, ou diga ao seu editor do Windows para usar as terminações de linha do Linux (a maioria dos editores de texto que são menos estressados do que o Bloco de Notas pode fazer isso).

    
por 08.05.2015 / 00:13
0

Por favor, dê uma olhada em man bash section FILES onde a diferença é explicada em bash_profile e bashrc:

   ~/.bash_profile
          The personal initialization file, executed for login shells
   ~/.bashrc
          The individual per-interactive-shell startup file

Parece que você está iniciando um novo shell e que as entradas que você colocou em ~ / .bash_profile não são usadas.

Tente definir as entradas no arquivo ~ / .bash_rc.

    
por 07.05.2015 / 16:26