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?

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)


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


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"


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.


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.

  • ~ / .bashrc (é avaliado 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_profile (é avaliado 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.


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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.