Por que meu ~ / .bash_profile não funciona?

35

Estou usando o Linux Mint. Meu shell de login ( cat /etc/passwd | grep myUserName) é bash.

Depois de iniciar o ambiente gráfico da área de trabalho e executar um emulador de terminal, percebo que ele .bash_profilenão é originário (os vários ambientes exportnele não estão configurados). Mas se eu fizer login em um console de texto ( ctrl+ alt+ F1) ou executar manualmente bash -lno emulador de terminal, .bash_profilefuncionará bem.

Estou errado quando penso que isso .bash_profiledeve ser originado quando o X é iniciado e que todos exportos vars devem estar disponíveis no terminal, rodando no X?

PS Não é uma boa ideia colocar tudo .bashrce obter a fonte .bash_profile( https://stackoverflow.com/questions/902946/ ): o material do ambiente deve ser obtido apenas uma vez.

AntonioK
fonte

Respostas:

39

O arquivo ~/.bash_profileé lido pelo bash quando é um shell de logon. É isso que você obtém ao fazer login no modo de texto.

Quando você faz logon no X, os scripts de inicialização são executados por /bin/sh. No Ubuntu e Mint, /bin/shé dash , não bash. O Dash e o bash têm os mesmos recursos principais, mas o dash adere a esses recursos principais para ser rápido e pequeno, enquanto o bash adiciona muitos recursos ao custo de exigir mais recursos. É comum usar o traço para scripts que não precisam de recursos extras e bash para uso interativo (embora o zsh tenha muitos recursos melhores ).

A maioria das combinações de gerenciador de exibição (o programa onde você digita seu nome de usuário e senha) e ambiente desktop ler ~/.profilea partir dos scripts de login em /etc/X11/Xsession, /usr/bin/lightdm-session, /etc/gdm/Xsessionou o que for aplicável. Então coloque suas definições de variáveis ​​de ambiente em ~/.profile. Certifique-se de usar apenas a sintaxe suportada pelo traço.

Então, o que você deve colocar onde?

  • Uma boa .bash_profilecarga .profile, e carrega .bashrcse o shell é interativo.

    . ~/.profile
    if [[ $- == *i* ]]; then . ~/.bashrc; fi
    
  • Em .profile, coloque definições de variáveis ​​de ambiente e outras configurações de sessão, como ulimit.

  • Em .bashrc, coloque configurações interativas do bash, como aliases, funções, conclusão, combinações de teclas (que não estão presentes .inputrc),…

Veja também Diferença entre o Shell de Login e o Shell Não-Login? e Alternativa ao .bashrc .

Gilles 'SO- parar de ser mau'
fonte
1
muitas coisas aprendidas com resposta única :)
mtk
16

.bash_profileé o script de configuração de inicialização do bash. Não existe um padrão exigindo X para a fonte .bash_profile.

O que você está pensando é bastante .profile. Originalmente, era o arquivo de configuração de inicialização do shell bourne (sh). Hoje, muitas distribuições têm seu ambiente de desktop configurado para a origem .profile. Observe que isso também não é um padrão, mas parece ser uma convenção.

O Debian costumava buscar fontes .profileno login gráfico ( página da wiki a partir de 2013 ) agora não ( página da wiki a partir de 2016 ).

Arquivar fontes .xprofileno login gráfico ( página wiki a partir de 2013 ).

O Ubuntu costumava desencorajar o uso .profile( página wiki a partir de 2013 ) agora não desencoraja mais ( página wiki a partir de 2016 ).


Em relação à sua outra pergunta: Por que meu ~ / .bash_profile não funciona? Esse é o comportamento esperado.

O comportamento, em resumo, é o seguinte:

  • bash iniciado como um shell de logon interativo: lê ~/.profile
  • bash iniciado como um shell interativo sem logon: lê ~/.bashrc

Para obter mais detalhes, consulte minha resposta para uma pergunta semelhante no askubuntu: https://askubuntu.com/questions/132276/configure-gnome-terminal-to-start-bash-as-a-login-shell-doesnt-read-bashrc / 132319 # 132319

lesmana
fonte
1
Parte disso está correta, mas “sempre leia ~/.bashrc” é um mau conselho: você deve ler apenas .bashrcde um shell interativo . Você perdeu o problema principal aqui, que é que, ao fazer login no X, não há instância de login do bash (na maioria das combinações de gerenciador de exibição / ambiente de desktop, incluindo evidentemente o AntonioK).
Gilles 'SO- stop be evil' (
Obrigado pelo seu feedback. Espero ter atualizado minha resposta o suficiente para resolver suas reclamações. Em relação ao meu conselho de "sempre ler .bashrc", eu sempre quis um shell interativo. Eu esclareci essa parte. Espero que não seja mais enganoso.
Lesmana
2
"O Ubuntu desencoraja especificamente o uso .profile( link ) " O wiki uma vez (absurdamente) desencorajou isso; isso foi consertado. (A observação /etc/profilepermanece desencorajada para atribuições em todo o sistema, em vez de incluir scripts /etc/profile.d.) Os .profilearquivos por usuário agora são apresentados como uma das maneiras recomendadas para definir variáveis ​​de ambiente por usuário: "Arquivos adequados para configurações de variáveis ​​de ambiente que devem afetar apenas um usuário específico (em vez do sistema como um todo) são ~ / .pam_environment e ~ / .profile . "
Eliah Kagan
A página vinculada sobre o Debian especifica que o Debian não~/.profilepara login gráfico e ~/.xsessionrcdeve ser usado.
Karora
obrigado por perceber. a página wiki foi atualizada. Eu vinculei às versões como elas estavam no momento da resposta.
Lesmana
2

Na sua pergunta, consulte https://stackoverflow.com/questions/902946/ como recomendação para não obter a fonte, quando a resposta aceita prescreve

  • Coloque minha configuração PATH em um arquivo .profile (porque às vezes uso outras conchas)
  • Coloque meus aliases e funções do Bash no meu arquivo .bashrc
  • Então use este [EDITADO: snip code-comments]:

    .bash_profile:

    #!/bin/bash
    # echo "Loading ${HOME}/.bash_profile"
    source ~/.profile # Get the paths
    source ~/.bashrc  # get aliases

Colocar tudo .profileisso não funcionou para mim no Linux Mint. Usando .bashrcfuncionou bem.

serv-inc
fonte
2

Surgem alguns problemas ao tentar recarregar / arquivo de origem ~ / .profile. [Isso se refere ao Ubuntu linux - em alguns casos, os detalhes dos comandos serão diferentes]

  1. Você está executando isso diretamente no terminal ou em um script?
  2. Como você executa isso em um script?

De Anúncios. 1)

Executar isso diretamente no terminal significa que não haverá sub-shell criado. Então você pode usar dois comandos:

source ~/.bash_profile

ou

. ~/.bash_profile

Nos dois casos, isso atualizará o ambiente com o conteúdo do arquivo .profile.

Anúncio 2) Você pode iniciar qualquer script bash chamando

sh myscript.sh 

ou

. myscript.sh

No primeiro caso, isso criará um subshell que não afetará as variáveis ​​de ambiente do seu sistema e elas serão visíveis apenas para o processo do subshell. Após concluir o comando subshell, nenhuma das exportações, etc. será aplicada. Este é um erro comum e faz com que muitos desenvolvedores percam muito tempo.

Para que suas alterações aplicadas em seu script tenham efeito no ambiente global, o script deve ser executado com

.myscript.sh

comando.

Para garantir que seu script não seja executado em um subshel, você pode usar esta função. (Novamente, o exemplo é para o shell do Ubuntu)

#/bin/bash

preventSubshell(){
  if [[ $_ != $0 ]]
  then
    echo "Script is being sourced"
  else
    echo "Script is a subshell - please run the script by invoking . script.sh command";
    exit 1;
  fi
}

Espero que isso elimine alguns dos mal-entendidos comuns! : D Boa Sorte!

twboc
fonte
0

A solução simples é tornar o terminal um terminal de login. Para o terminal Gnome em 'Lado a lado e comando' do perfil padrão, você pode marcar a caixa "Executar comando como um shell de login". Este artigo explica a diferença entre um shell de logon e um que não é.

driftingprogrammer
fonte