Esta pergunta já tem uma resposta aqui:
- Diferença entre .bashrc e .bash_profile 6 respostas
Isso é constrangedor, mas depois de muitos anos de utilização de sistemas POSIX em tempo integral, eu ainda tenho um tempo difícil descobrir se uma personalização shell deve ir .bashrc
, .profile
ou em outro lugar. Sem mencionar alguns dos arquivos de configuração específicos do SO, como .pam_environment
.
Sim, eu sei como resolver a documentação e aprender quando cada arquivo é ou não é carregado. O que me pergunto é se alguém tem todas as diretrizes completas para decidir em qual arquivo colocar um determinado tipo de personalização.
Respostas:
TL; DR:
~/.bash_profile
deve ser super simples e apenas carregar.profile
e.bashrc
(nessa ordem)~/.profile
tem o material NÃO especificamente relacionado ao bash, como variáveis de ambiente (PATH
e amigos)~/.bashrc
tem o que você deseja em uma linha de comando interativa. Prompt de comando,EDITOR
variável, aliases de bash para meu usoAlgumas outras notas:
Qualquer coisa que deva estar disponível para aplicações gráficas OU para sh (ou bash invocado como
sh
) DEVE estar dentro~/.profile
~/.bashrc
não deve produzir nadaQualquer coisa que deva estar disponível apenas para os shells de login deve entrar
~/.profile
Verifique se isso
~/.bash_login
não existe.fonte
~/.profile
definir corretamente o ambiente para serviços como GDM / LightDM / LXDM que executam explicitamente / bin / sh..bashrc
saídas muitas coisas, você pode comentar sobre isso? Em particular, onde devo colocar a saída de saudação?[[ $- == *i* ]]
, ou seja, procurando 'i' na$-
variável especial . Obviamente, isso só importa em primeiro lugar nos sistemas em que o bash é compilado para ser lido.bashrc
no modo não interativo. (Ou seja, o Debian, mas não o Arch.) Mas é uma causa frequente de mensagens de erro misteriosas ao tentar conectar-se usandosftp
ouscp
ferramentas semelhantes..bash_profile
e.profile
. Mas o bash lê apenas o primeiro de três. Significado, se você tiver um.bash_login
, então ambos.profile
e.bash_profile
serão misteriosamente ignorados.Ao longo dos últimos anos, eu tinha um monte de tempo a perder, então eu ter pesquisado isso por um pouco mais de apenas 10 minutos. Não tenho idéia se esse é o melhor layout, é apenas aquele que funciona corretamente em praticamente todos os casos.
Os requisitos:
~/.profile
deve ser compatível com qualquer / bin / sh - isso inclui bash, dash, ksh, qualquer outra coisa que uma distribuição possa optar por usar.As variáveis de ambiente devem ser colocadas em um arquivo que seja lido pelos logins do console (por exemplo, um shell de 'login') e pelos logons gráficos (por exemplo, gerenciadores de exibição como GDM, LightDM ou LXDM).
Há muito pouco sentido em ter ambos
~/.profile
e~/.bash_profile
. Se o último estiver faltando, o bash usará o primeiro com prazer, e qualquer linha específica do bash poderá ser protegida com uma verificação de$BASH
ou$BASH_VERSION
.A separação entre
*profile
e*rc
é que o primeiro é usado para shells de 'login' e o segundo toda vez que você abre uma janela do terminal. No entanto, o bash no modo 'login' não é originado~/.bashrc
, portanto, é~/.profile
necessário fazê-lo manualmente.A configuração mais simples seria:
Tenha um
~/.profile
que defina todas as variáveis de ambiente (exceto as específicas do bash), talvez imprima uma linha ou duas e depois as fontes,~/.bashrc
se estiver sendo executado pelo bash, seguindo a sintaxe compatível com sh.Tenha uma
~/.bashrc
que execute qualquer configuração específica do shell, protegida com uma verificação do modo interativo para evitar quebras de coisas comosftp
no Debian (onde o bash é compilado com a opção de carregar~/.bashrc
mesmo para shells não interativos):No entanto, também há o problema de que certos comandos não interativos (por exemplo
ssh <host> ls
) pulam~/.profile
, mas as variáveis de ambiente seriam muito úteis para eles.Certas distribuições (por exemplo, Debian) compilam seu bash com a opção de
~/.bashrc
obter esses logins não interativos. Nesse caso, achei útil mover todas as variáveis de ambiente (asexport ...
linhas) para um arquivo separado~/.environ
e obtê-lo de ambos.profile
e.bashrc
, com um protetor, para evitar fazer isso duas vezes:Infelizmente, para outras distribuições (por exemplo, Arch), não encontrei uma solução muito boa. Uma possibilidade é usar o módulo PAM (ativado por padrão) pam_env, colocando o seguinte em
~/.pam_environment
:Então, é claro, atualizando
~/.environ
paraunset BASH_ENV
.Conclusão? Conchas são uma dor. Variáveis de ambiente são uma dor. As opções de tempo de compilação específicas da distribuição são um imenso problema .
fonte
.profile
e.bashrc
de.bash_profile
e manter.profile
limpo..profile
está limpo , obrigado.~/.profile
e~/.bash_profile
": eu discordo. Veja a resposta de Dan para o porquê..profile
e guardar asbash
partes específicas com condicionais.Dê uma olhada neste excelente post de ShreevatsaR . Aqui está um extrato, mas acesse a postagem do blog, que inclui uma explicação para termos como "shell de login", um fluxograma e uma tabela semelhante para o Zsh.
fonte
/etc/profile
chamadas/etc/bash.bashrc
e~/.profile
chamadas~.bashrc
. Tão eficazmente/etc/bash.bashrc
e também~/.bashrc
estão sendo executados para logins interativos./bin/sh
BASH_ENV
). O parágrafo relacionado da página de manual do bash pode ser encontrado pesquisandoIf bash is invoked with the name sh
.Ofereço minhas diretrizes "abrangentes":
.bash_profile
e.profile
carregue,.bashrc
se existir, usando, por exemplo[ -r $HOME/.bashrc ] && source $HOME/.bashrc
.bashrc
.EDIT: Adicionado citações de medo para "abrangente", caso alguém se sinta tentado a acreditar. ;)
fonte
.bash_profile
e.profile
é um pouco redundante; você só precisa do último. Você precisa torná-lo / bin / sh-proof, no entantoif [ "$BASH" ] && [ -r ~/.bashrc ]; then . ~/.bashrc; fi
:, pois existem programas (nomeadamente gdm / lightdm) que originam manualmente o arquivo a partir de um script / bin / sh. Isso também significa que o ambiente mantido.bashrc
seria ineficaz. Tinha que -1, pois suas diretrizes "abrangentes" não funcionarão em muitos sistemas, como eu havia descoberto da maneira mais difícil várias vezes.Desisti de tentar descobrir isso e criei um script (
~/.shell-setup
), que sou fonte de todos os outros.Essa abordagem requer
~/.shell-setup
dois recursos:# 1 é bastante padrão, embora talvez não seja muito usado em scripts de shell.
# 2 é mais complicado. Aqui está o que eu uso no bash:
Infelizmente, não me lembro de como surgiu isso, ou por que detectar um shell interativo não era suficiente.
fonte
Coloque tudo em
.bashrc
e, em seguida, fonte.bashrc
de.profile
Na página do man bash (no OS X 10.9):
O texto acima é o motivo pelo qual tudo é colocado
.bashrc
. No entanto, há um comportamento um pouco diferente ao lidar com um shell de login. Novamente, citando a partir da página de manual:.profile
é lido para shells de login, mas.bashrc
não é. Duplicar tudo isso.bashrc
é ruim ™, por isso precisamos fornecê-lo.profile
para que o comportamento permaneça consistente.No entanto, você não deseja obter
.bashrc
de forma.profile
incondicional. Consulte os comentários e outras respostas para obter detalhes adicionais.fonte
.bashrc
de.profile
. Veja a resposta de @ DanRabinowitz.[ -n "$BASH" -a -f ~/.bashrc ] && . ~/.bashrc
seria um doce delineador para.profile
.