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

28

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

Depois de iniciar meu ambiente de área de trabalho gráfica e executar um emulador de terminal, vejo que .bash_profile não é originado (vars de ambiente que são export ed não são definidos). Mas se eu fizer login de um console de texto ( ctrl + alt + F1 ) ou executar manualmente bash -l do emulador de terminal, .bash_profile funciona bem.

Estou errado quando penso que .bash_profile deve ser originado quando o X é iniciado e todos os export 'ed vars devem estar disponíveis no terminal, sendo executados a partir do X?

P.S. Colocar tudo em .bashrc e fazer o sourcing de .bash_profile não é uma boa ideia ( link ): o material do ambiente deve ser originado apenas uma vez.

    
por AntonioK 25.08.2013 / 10:09

5 respostas

32

O arquivo ~/.bash_profile é lido pelo bash quando é um shell de login. É isso que você recebe quando faz o login no modo de texto.

Quando você faz o login no X, os scripts de inicialização são executados por /bin/sh . No Ubuntu e no Mint, /bin/sh é o traço , não o bash. Dash e bash têm os mesmos recursos centrais, mas traçam com esses recursos principais para serem rápidos e pequenos, enquanto o bash adiciona muitos recursos com o custo de exigir mais recursos. É comum usar dash para scripts que não precisam dos recursos extras e bash para uso interativo (embora zsh tem um monte de recursos mais agradáveis ).

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

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

  • Um bom .bash_profile carrega .profile e carrega .bashrc se o shell for interativo.

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

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

Veja também Diferença entre o Login Shell e Non-Login Shell? e Alternativa para .bashrc .

    
por 26.08.2013 / 00:43
15

.bash_profile é o script de configuração de inicialização do bash. Não existe nenhum padrão mandando X para a origem .bash_profile .

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

O Debian usou a fonte .profile no login gráfico ( página wiki a partir de 2013 ) agora isso não acontece ( página wiki a partir de 2016 ).

Arch sources .xprofile no login gráfico ( página wiki a partir de 2013 ) .

O Ubuntu costumava desencorajar o uso de .profile ( página wiki a partir de 2013 ) agora ele não desanima 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, resumindo, é o seguinte:

  • bash começou como um shell de login interativo: lê ~/.profile
  • bash iniciado como um shell interativo de não-login: lê ~/.bashrc

Para mais detalhes veja a minha resposta a uma pergunta semelhante no askubuntu: link

    
por 25.08.2013 / 10:44
1

Em sua pergunta, você se refere ao link como recomendando a não origem, quando a resposta aceita prescreve para

  • Put my PATH setup into a .profile file (because I sometimes use other shells)
  • Put my Bash aliases and functions into my .bashrc file
  • Then use this [EDITED: snip code-comments]:

    .bash_profile:

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

Colocar tudo em .profile não funcionou para mim no Linux Mint. Usando .bashrc funcionou bem.

    
por 06.04.2016 / 09:50
1

Alguns problemas surgem ao tentar recarregar / enviar o arquivo ~ / .profile. [Isto 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?

Anúncio. 1)

A execução direta no terminal significa que não haverá sub-rede criada. Então você pode usar dois comandos:

source ~/.bash_profile

ou

. ~/.bash_profile

Em ambos os 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 estarão visíveis apenas para o processo de subshell. Depois de terminar o comando subshell, nenhuma das exportações, etc., será aplicada. Este é um erro comum e causa muitos desenvolvedores a perder muito tempo.

Para que as 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 essa 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 mal-entendidos comuns! : D Boa sorte!

    
por 23.10.2017 / 17:43
0

A solução simples é tornar o terminal um terminal de login. Para o terminal Gnome em 'Tile and Command' 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 login e outro que não é.

    
por 01.11.2014 / 14:36