Tradicionalmente, quando você entra em um sistema Unix, o sistema inicia um programa para você. Esse programa é um shell, ou seja, um programa projetado para iniciar outros programas. É um shell de linha de comando: você inicia outro programa digitando seu nome. O shell padrão, um shell Bourne, lê comandos de ~/.profile quando é invocado como o shell de login.
Bash é uma concha parecida com Bourne. Ele lê os comandos de ~/.bash_profile quando é invocado como o shell de login e, se esse arquivo não existir, ele tenta ler ~/.profile .
Você pode invocar um shell diretamente a qualquer momento, por exemplo, iniciando um emulador de terminal dentro de um ambiente GUI. Se o shell não for um shell de login, ele não lerá ~/.profile . Quando você inicia o bash como um shell interativo (ou seja, não executa um script), ele lê ~/.bashrc (exceto quando chamado como shell de login, ele lê somente ~/.bash_profile ou ~/.profile .
Portanto:
-
~/.profileé o lugar para colocar coisas que se aplicam a toda a sua sessão, como programas que você deseja iniciar ao efetuar login (mas não programas gráficos, eles entram em um arquivo diferente) e ambiente definições de variáveis. -
~/.bashrcé o local para colocar coisas que se aplicam apenas ao bash, como definições de alias e funções, opções de shell e configurações de prompt. (Você também pode colocar as associações de teclas lá, mas para o bash elas normalmente entram em~/.inputrc.) -
~/.bash_profilepode ser usado em vez de~/.profile, mas é lido apenas por bash, não por qualquer outro shell. (Isso é principalmente uma preocupação se você quiser que os arquivos de inicialização trabalhem em várias máquinas e o seu shell de login não seja o bash em todos eles.) Esse é um lugar lógico para incluir~/.bashrcse o shell for interativo. Eu recomendo o seguinte conteúdo em~/.bash_profile:if [ -r ~/.profile ]; then . ~/.profile; fi case "$-" in *i*) if [ -r ~/.bashrc ]; then . ~/.bashrc; fi;; esac
Em unices modernos, há uma complicação adicional relacionada a ~/.profile . Se você efetuar login em um ambiente gráfico (ou seja, se o programa onde você digita sua senha estiver sendo executado no modo gráfico), você não receberá automaticamente um shell de login que leia ~/.profile . Dependendo do programa de login gráfico, no gerenciador de janelas ou no ambiente de área de trabalho que você executa posteriormente e em como sua distribuição configurou esses programas, seu ~/.profile pode ou não ser lido. Se não é, geralmente há outro lugar onde você pode definir variáveis de ambiente e programas para iniciar quando você efetua login, mas infelizmente não há localização padrão.
Observe que você pode ver aqui e ali as recomendações para colocar as definições de variáveis de ambiente em ~/.bashrc ou sempre ativar os shells de login nos terminais. Ambas são idéias ruins. O problema mais comum com qualquer uma dessas idéias é que suas variáveis de ambiente só serão definidas em programas iniciados por meio do terminal, não em programas iniciados diretamente com um ícone ou menu ou atalho de teclado.
¹ Para completar, por solicitação: se .bash_profile não existir, o bash também tenta .bash_login antes de retornar a .profile . Sinta-se livre para esquecer que existe.