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

175

Problema

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

  1. sudo apt-get install openjdk-6-jdk
  2. Adicionadas as seguintes entradas ao ~ / .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 fosse feita.

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

Questões

  1. Por que eu tenho que fazer isso? Eu pensei que bash_profile, bash_login ou perfil na ausência desses dois fosse executado primeiro antes do bashrc.
  2. Nesse caso, meu terminal era um shell sem login ?
  3. Se sim, por que ao fazer su após o terminal e colocar a senha, ele não executou o perfil onde eu também havia definido as exportações mencionadas acima?
Viriato
fonte

Respostas:

224

~/.bash_profileé originado apenas pelo bash quando iniciado no modo de login interativo. Isso normalmente ocorre apenas quando você faz login no console ( Ctrl+ Alt+ F1.. F6) ou se conecta via ssh.

Quando você efetua login graficamente, ~/.profileserá especificamente fornecido pelo script que inicia o gnome-session (ou qualquer ambiente de área de trabalho que você esteja usando). Portanto, isso ~/.bash_profilenão é originado quando você faz login graficamente.

Quando você abre um terminal, o terminal inicia o bash no modo interativo (sem login), o que significa que ele será originado ~/.bashrc.

O local certo para você colocar essas variáveis ​​de ambiente está ~/.profilee o efeito deve ser aparente na próxima vez que você efetuar o login.

Abastecimento ~/.bash_profilede ~/.bashrcé a solução errada. Deveria ser o contrário; ~/.bash_profiledeve fonte ~/.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ê realmente não precise configurar JAVA_HOMEou alterar PATH)

Geirha
fonte
6
Descobri que, ao abrir um terminal na barra lateral do Ubuntu 12, o arquivo ~ / .profile não é carregado.
jcollum
3
@jcollum Isso é bom. .profilesó deve ser adquirido quando você entrar.
geirha
2
abrir um terminal não é o mesmo que fazer login ... eu estava pensando em fazer login no terminal .
jcollum
2
Lembre-se de que .profileé ignorado pelo bash, se .bash_profileexistir. Veja minha resposta aqui e man bashpara mais detalhes.
terdon
3
@terdon, sim, mas o bash não está envolvido ao efetuar login graficamente, por isso é fácil .profile.
Geirha 11/0314
48

Você pode verificar se o seu shell Bash foi iniciado como um shell de login executando:

shopt login_shell

Se a resposta for offvocê não está executando um shell de logon.

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

Trecho de man bash:

Quando o bash é chamado como um shell de logon interativo ou como um shell não interativo com a --login opção, ele primeiro lê e executa comandos do arquivo /etc/profile, se esse arquivo existir. Depois de ler esse arquivo, ele procura ~/.bash_profile, ~/.bash_logine ~/.profile, nessa ordem, e lê e executa comandos a partir do primeiro que existe e é legível.

supor outro lado, também não inicia um shell de login por padrão, você deve solicitar que ele faça isso usando a --loginopção

lgarzo
fonte
9
Muito obrigado pelo comando shotp login_shell . Impressionante!!
Viriato
27

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 do perfil -> guia Título e comando, marque a opção "Executar comando como um shell de login"

kisoku
fonte
1
Quais são as desvantagens de ativar essa configuração?
ChrisH
2
@ Chris, você está carregando o código um pouco mais do que o necessário em muitas ocasiões. Provavelmente não importa se você ~/.bash_profileestá avaliando muito rapidamente, o que provavelmente é o caso. Uma boa coisa a verificar é perseguir todas as chamadas para outros processos que geralmente são bastante caros.
vaab
14

Se você abrir um terminal ou executar, suo shell não será executado como um shell de login, mas como um shell interativo normal. Então lê, ~/.bashrcmas não ~/.bash_profile. Você pode executar sucom a -lopção de fazê-lo executar seu shell como um shell de logon.

Quando você está trabalhando com uma GUI, o shell geralmente nunca é executado como um shell de logon, portanto, geralmente é bom colocar todas as suas coisas ~/.bashrc.

Florian Diesch
fonte
1
Foi o que eu fiz e funcionou, mas verifique o que o cara diz, ele sugere que é uma má idéia colocá-lo no bashrc e colocá-lo no perfil. .... Ei, nos dois sentidos, muito obrigado.
Viriato
4

TL; DR

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

Coloque suas coisas ~/.bashrc, elas serão avaliadas toda vez.

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

Pontos principais para entender o que está acontecendo:

  • todos os processos no linux possuem e usam variáveis ​​de ambiente
  • variáveis ​​de ambiente são herdadas
  • portanto, defini-los uma vez no pai de todo o seu processo é suficiente (especialmente se exigir algum tempo de computação).
  • o pai de todo o seu processo normalmente é iniciado após o login no seu dispositivo (forneça suas credenciais).
  • há coisas que você pode querer fazer apenas uma vez ao fazer login no seu computador (verifique se há novas mensagens, por exemplo ...).

Portanto, o horário do "login" normalmente é:

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

Ok, então onde colocar minhas coisas?

É bastante complexo, a história completa está aqui . Mas aqui está uma degradação bastante comum para usuários do Ubuntu. Então, considerando que:

  • você usa bashshell,
  • você tem uma ~/.bash_profilee segue a recomendação para adicionar o carregamento ~/.bashrcno seu ~/.bash_profile, a fim de obter pelo menos um arquivo que seja avaliado independentemente do mecanismo de chamada .

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

  • ~ / .bashrcavaliado em todas as ocasiões , desde que você siga a recomendação)

    Para -avaliação rápida variável de ambiente e código para o seu utilizador-apenas e só de festa de uso de linha de comando (aliases, por exemplo). bashism são bem-vindos.

    Ele é carregado sobre si mesmo:

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

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

  • ~ / .bash_profileavaliado apenas em ocasiões específicas )

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

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

    Para variáveis ​​de ambiente de avaliação lenta e sem bashism para seus processos somente de usuário e todos os de sessão gráfica . Ele é carregado no login na sua interface gráfica.

vaab
fonte
Nas ocasiões em que o bash carrega um arquivo de perfil, ele carrega .profilese .bash_profilenão existir.
muru 8/0318
Muito obrigado pela explicação clara. Isso ajuda novatos como eu. No Mac Mojave, se eu colocar variáveis ​​em ~ / .bashrc e fazer source, e se envaparecer, não vejo as variáveis ​​env definidas (tentei fechar o iTerm e reabrir). Mas percebo que, quando instalei o Android studio e outros aplicativos, todos esses ambientes foram instalados /.bash_profile. Então, quando eu adicionei /.bash_profile, funcionou como charme. Por que é que?
sofs1 18/08