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, comoulimit
. - 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 lê
~/.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]
- Você está executando isso diretamente no terminal ou em um script?
- 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 é.