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

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áfico e executar um emulador de terminal a partir dele, posso ver que .bash_profile não tem origem (variáveis de ambiente que são export ed nele estão indefinidos). Mas se eu logar em 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 fornecido quando o X é iniciado e todos os export “vars devem estar disponíveis no terminal, em execução no X?

PS Colocar tudo em .bashrc e obtê-lo em .bash_profile não é uma boa ideia ( https://stackoverflow.com/questions/902946/ ): o material do ambiente deve ser fornecido apenas uma vez.

Resposta

O arquivo ~/.bash_profile é lido pelo bash quando é um shell de login. Isso é o que você obtém quando faz login no modo de texto.

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

A maioria das combinações de exibição gerenciador (o programa em que você digita seu nome de usuário e senha) e o ambiente de área de trabalho lê ~/.profile nos 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ável de ambiente em ~/.profile. Certifique-se de usar apenas sintaxe compatível com o traço.

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 de variáveis de ambiente e outras configurações de sessão, como ulimit.

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

Veja também Diferença entre Shell de login e Shell de não login? e Alternativa para .bashrc .

Comentários

  • muitas coisas aprendidas com uma única resposta: )
  • mesmo .profile não ‘ funciona no Debian 10 ” Buster “, apenas .bashrc wor ks

Resposta

.bash_profile é o script de configuração de inicialização de bash. Não existe um padrão que obrigue X a fornecer .bash_profile.

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

O Debian costumava fornecer .profile no login gráfico ( página wiki em 2013 ) agora não ( página wiki em 2016 ).

Fontes do Arch .xprofile no login gráfico ( página wiki em 2013 ).

Ubuntu costumava desencorajar o uso de .profile ( página wiki em 2013 ) agora não desanima mais ( página wiki 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 login interativo: lê ~/.profile
  • bash começou como um shell interativo sem login: lê ~/.bashrc

Para obter mais detalhes, consulte minha resposta a um símile ar question no askubuntu: https://askubuntu.com/questions/132276/configure-gnome-terminal-to-start-bash-as-a-login-shell-doesnt-read-bashrc/132319#132319

Comentários

  • Parte disso está correto, mas“ sempre leia ~/.bashrc ”é um conselho ruim: você deve apenas ler .bashrc a partir de um shell interativo .Você ‘ perdeu o principal problema 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 área de trabalho, incluindo evidentemente AntonioK ‘ s).
  • Obrigado por seus comentários. Espero ter atualizado minha resposta o suficiente para resolver suas reclamações. Em relação ao meu conselho para “, sempre leia .bashrc “, sempre quis dizer para um shell interativo . Eu esclareci essa parte. Espero que não seja mais enganoso.
  • O Ubuntu desencoraja especificamente o uso de .profile ( link ) ” O wiki uma vez (absurdamente) desencorajou isso; que ‘ s foram corrigidos. (Observe que /etc/profile permanece desencorajado para atribuições em todo o sistema, em preferência para adicionar scripts a /etc/profile.d.) Por usuário .profile os arquivos 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 . ”
  • A página vinculada sobre o Debian especifica que o Debian não ~/.profile para login gráfico e ~/.xsessionrc deve ser usado em seu lugar.
  • obrigado por notar. a página wiki foi atualizada. Eu vinculei as versões como estavam no momento da resposta.

Resposta

Alguns problemas surgem quando tentando recarregar o arquivo / source ~ / .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 fazer você executa isso em um script?

Anúncio. 1)

Executar isso diretamente no terminal significa que não haverá subshell criado. Portanto, 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 de seu sistema e eles serão visíveis apenas para o processo de subshell. Depois de terminar o comando de subshell, nenhuma das exportações, etc. será aplicada. ESTE É UM ERRO COMUM E FAZ COM QUE MUITOS DESENVOLVEDORES PERDEM MUITO TEMPO.

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

.myscript.sh 

.

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!

Resposta

Em sua pergunta, você se refere a https://stackoverflow.com/questions/902946/ como recomendação de não fornecer, quando a resposta aceita prescreve para

  • Coloque minha configuração PATH em um arquivo .profile (porque às vezes eu uso outros shells)
  • Coloque meus aliases e funções Bash no meu. arquivo bashrc
  • Em seguida, use este [EDITADO: comentários de código de recorte]:

    .bash_profile:

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

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

Resposta

A solução simples é fazer o terminal um terminal de login. Para o terminal Gnome em “Bloco e comando” do perfil padrão, você pode marcar a caixa “Executar comando como shell de login”. Este artigo explica a diferença entre um shell de login e outro que não é.

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *