Por que ~ / .bash_profile não está sendo adquirido ao abrir um terminal?

139

Problema

Eu tenho uma máquina virtual Ubuntu 11.04 e queria configurar meu ambiente de desenvolvimento Java. Eu fiz o seguinte

  1. sudo apt-get install openjdk-6-jdk
  2. Adicionadas as seguintes entradas a ~ / .bash_profile

    export JAVA_HOME=/usr/lib/jvm/java-6-openjdk
    
    export PATH=$PATH:$JAVA_HOME/bin
    
  3. Salve as alterações e saia

  4. Abra um terminal novamente e digite o seguinte

    echo $JAVA_HOME   (blank)
    echo $PATH        (displayed, but not the JAVA_HOME value)
    
  5. Nada aconteceu, como se a exportação de JAVA_HOME e sua adição ao PATH nunca tivessem sido feitas.

Solução

Eu tive que ir para ~ / .bashrc e adicionar a seguinte entrada no final do arquivo

#Source bash_profile to set JAVA_HOME and add it to the PATH because for some reason is not being picked up
. ~/.bash_profile

Perguntas

  1. Por que eu tive que fazer isso? Eu pensei que bash_profile, bash_login ou profile na ausência desses dois fossem executados antes de bashrc.
  2. Nesse caso, meu terminal era um shell não-login ?
  3. Em caso afirmativo, por que ao fazer o su após o terminal e colocar a senha ele não executou o perfil onde eu também havia configurado as exportações mencionadas acima?
por Viriato 11.04.2012 / 18:27

5 respostas

186

~/.bash_profile é originado apenas pelo bash quando iniciado no modo de login interativo. Isso é tipicamente somente quando você loga no console ( Ctrl + Alt + F1 .. F6 ), ou conectando via ssh.

Quando você fizer login graficamente, ~/.profile será especificamente originado pelo script que inicia o gnome-session (ou qualquer ambiente de desktop que você esteja usando). Portanto, ~/.bash_profile não é originado quando você faz login graficamente.

Quando você abre um terminal, o terminal inicia o modo interativo (sem login), o que significa que ele irá fornecer ~/.bashrc .

O lugar certo para você colocar essas variáveis de ambiente é em ~/.profile , e o efeito deve ser aparente na próxima vez que você fizer login.

A determinação de ~/.bash_profile de ~/.bashrc é a solução errada. É suposto ser o contrário; ~/.bash_profile deve originar ~/.bashrc .

Veja DotFiles para uma explicação mais completa, incluindo um histórico de por que é assim.

(Em uma nota lateral, ao instalar o openjdk via apt, os links simbólicos devem ser configurados pelo pacote, para que você não precise realmente definir JAVA_HOME ou alterar PATH )

    
por geirha 11.04.2012 / 18:41
40

Você pode verificar se o seu shell Bash é iniciado como um login-shell executando:

shopt login_shell

Se a resposta for off , você não está executando um shell de login.

Leia a seção invocação do manual do Bash sobre como o Bash lê (ou não lê) arquivos de configuração diferentes.

Trecho de man bash :

% bl0ck_qu0te%

su por outro lado também não inicia um shell de login por padrão, você tem que dizer para fazer isso usando a opção --login .

    
por lgarzo 11.04.2012 / 18:59
22

Eu acho que vale a pena mencionar que você pode alterar o padrão do gnome-terminal para usar um shell de login (ou seja, bash -l) editando as preferências do perfil.

vá para Editar - > Preferências de perfil - > Título e guia Comando marque a opção "Executar comando como uma shell de login"

    
por kisoku 22.06.2013 / 02:23
14

Se você abrir um terminal ou executar su , o shell não será executado como um shell de login, mas como um shell interativo normal. Por isso, lê ~/.bashrc mas não ~/.bash_profile . Você pode executar su com a opção -l para fazer com que ele seja executado como um shell de login.

Quando você está trabalhando com uma GUI, o shell geralmente nunca é executado como um shell de login, então é normal colocar todo o material em ~/.bashrc .

    
por Florian Diesch 11.04.2012 / 18:43
1

TL; DR

Na configuração recomendada clássica do ubuntu, ~/.bash_profile é avaliado apenas em ocasiões específicas. E isso faz sentido.

Coloque seu material em ~/.bashrc , ele será avaliado toda vez.

Ok, eu quero entender, por que isso faz sentido?

Keypoints para entender o que está acontecendo:

  • todos os processos no linux have e usa variáveis do ambiente
  • as variáveis de ambiente são herdadas
  • assim, definindo-os uma vez no pai de todo o processo é suficiente (especialmente se requer algum tempo de computação).
  • o pai de todo o seu processo é normalmente lançado depois de você faça login no seu dispositivo (forneça suas credenciais).
  • há coisas que você pode querer fazer apenas uma vez ao fazer login seu computador (verifique se há novos e-mails, por exemplo ...).

Então, o tempo de "login" é normalmente:

  • No modo de console, quando você faz login (com Ctrl-Alt F1) ou ssh , como o shell será o pai de todo o processo, ele carregará seu ~/.bash_profile .
  • No modo gráfico, quando você abre sua sessão, o primeiro processo ( gnome-session para o Ubuntu clássico) será responsável por ler .profile .

Ok, então onde colocar minhas coisas?

É bastante complexo, a matéria completa está aqui . Mas aqui está uma corrida isso é bastante comum para usuários do Ubuntu. Então, considerando isso:

  • você usa bash shell,
  • você tem um ~/.bash_profile e segue a recomendação para adicionar o carregamento de ~/.bashrc no seu ~/.bash_profile para obter pelo menos um arquivo que é avaliado, seja qual for a invocação mecanismo .

Esta é uma sugestão rápida de onde colocar as coisas.

  • ~ / .bashrc (Obtém avaliado em todas as ocasiões , desde que você siga a recomendação)

    Para variável de ambiente avaliação rápida e código para o seu Uso de linha de comando apenas somente e bash-only (aliases para instância). bashism são bem-vindos.

    Ele é carregado em cima de si:

    • crie uma nova janela / painel de shell em sessões gráficas.
    • chamando bash
    • screen novo painel ou guia. (não tmux !)
    • qualquer instância bash em um cliente do console gráfico ( terminator / gnome-terminal ...) se você não marcar opção "executar comando como shell de login".

    E ele será carregado em todas as outras ocasiões, graças à recomendação anterior.

  • ~ / .bash_profile (Obtém avaliado apenas em ocasiões específicas )

    Para variável de ambiente avaliação lenta e código para seus processos somente para usuário e console-session . bashism são bem-vindos. Ele é carregado em:

    • login do console (Ctrl-Alt F1),
    • ssh logins para esta máquina,
    • tmux novo painel ou janelas (configurações padrão), (não screen !)
    • chamadas explícitas de bash -l ,
    • qualquer instância bash em um cliente do console gráfico ( terminator / gnome-terminal ...) somente se você marcar opção "executar comando como shell de login".
  • ~ / .profile (é avaliado apenas em sessão gráfica)

    Para variáveis de ambiente avaliação lenta e com não-bashism para o seu processo somente para usuário e todos os processos de sessão gráfica . Fica carregado após o login na sua interface gráfica.

por vaab 08.03.2018 / 04:58