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_profile
pode 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~/.bashrc
se 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.