Qual é a diferença entre .bashrc, .bash_profile e .environment?

Eu usei um número de diferentes sistemas baseados em * nix dos anos, e parece que cada sabor do Bash que eu uso tem um algoritmo diferente para decidir quais scripts de boot devem ser executados. Para fins de tarefas como configurar variables ​​de ambiente e aliases e imprimir mensagens de boot (por exemplo, MOTDs), qual script de boot é o local apropriado para fazer isso?

Qual é a diferença entre colocar as coisas em .bashrc , .bash_profile e .environment ? Eu também vi outros arquivos como .login , .bash_login e .profile ; são estes sempre relevantes? Quais são as diferenças em quais são executadas ao efetuar login fisicamente, efetuando login remotamente via ssh e abrindo uma nova janela de terminal? Existem diferenças significativas entre as plataformas (incluindo o Mac OS X (e seu Terminal.app) e o Cygwin Bash)?

A principal diferença com os arquivos de configuração do shell é que alguns são lidos apenas por shells “login” (por exemplo, quando você faz login de outro host ou faz login no console de texto de uma máquina unix local). esses são os chamados, digamos, .login ou .profile ou .zlogin (dependendo de qual shell você está usando).

Então você tem arquivos de configuração que são lidos por shells “interativos” (como em, aqueles conectados a um terminal (ou pseudo-terminal no caso de, digamos, um emulador de terminal rodando sob um sistema de janelas). Estes são aqueles com nomes como .bashrc , .tcshrc , .zshrc , etc.

bash complica isso, pois o .bashrc é lido apenas por um shell que é interativo e não-login , então você descobrirá que a maioria das pessoas acaba contando ao .bash_profile para ler também .bashrc com algo como

[[ -r ~/.bashrc ]] && . ~/.bashrc

Outros shells se comportam de maneira diferente – por exemplo, com zsh , o .zshrc é sempre lido para um shell interativo, seja um login ou não.

A página de manual do bash explica as circunstâncias sob as quais cada arquivo é lido. Sim, o comportamento é geralmente consistente entre as máquinas.

.profile é simplesmente o nome do arquivo de script de login usado originalmente por /bin/sh . bash , sendo geralmente compatível com /bin/sh , lerá .profile se existir.

Isso é simples É explicado no man bash :

 /bin/bash The bash executable /etc/profile The systemwide initialization file, executed for login shells ~/.bash_profile The personal initialization file, executed for login shells ~/.bashrc The individual per-interactive-shell startup file ~/.bash_logout The individual login shell cleanup file, executed when a login shell exits ~/.inputrc Individual readline initialization file 

As shells de login são aquelas que são lidas quando você faz o login (assim, elas não são executadas apenas quando iniciamos o xterm, por exemplo). Existem outras maneiras de fazer login. Por exemplo, usando um gerenciador de exibição X. Eles têm outras maneiras de ler e exportar variables ​​de ambiente no momento do login.

Leia também o capítulo INVOCATION no manual. Ele diz “Os parágrafos a seguir descrevem como o bash executa seus arquivos de boot.” , eu acho que é um spot-on 🙂 Ele explica o que é um shell “interativo” também.

Bash não sabe sobre o ambiente. Eu suspeito que é um arquivo de sua distribuição, para definir variables ​​de ambiente independente do shell que você dirige.

Classicamente, ~/.profile é usado pelo Bourne Shell, e é provavelmente suportado pelo Bash como uma medida legada. Novamente, ~/.login e ~/.cshrc foram usados ​​pelo C Shell – não tenho certeza se o Bash os usa.

O ~/.bash_profile seria usado uma vez, no login. O script ~/.bashrc é lido toda vez que um shell é iniciado. Isso é análogo ao /.cshrc para C Shell.

Uma conseqüência é que o material em ~/.bashrc deve ser o mais leve (mínimo) possível para reduzir a sobrecarga ao iniciar um shell que não seja de login.

Eu acredito que o arquivo ~/.environment é um arquivo de compatibilidade para o Korn Shell.

Eu encontrei informações sobre .bashrc e .bash_profile aqui para resumir:

.bash_profile é executado quando você faz o login. Coisas que você coloca lá podem ser o seu PATH e outras variables ​​de ambiente importantes.

.bashrc é usado para shells não de login. Não tenho certeza do que isso significa. Eu sei que o RedHat o executa toda vez que você inicia outro shell (su para esse usuário ou simplesmente chamando bash novamente). Você pode querer colocar aliases lá, mas novamente eu não tenho certeza do que isso significa. Eu simplesmente ignoro isso sozinho.

.profile é o equivalente de .bash_profile para a raiz. Eu acho que o nome é alterado para permitir que outras shells (csh, sh, tcsh) também o usem. (você não precisa de um como usuário)

Há também .bash_logout que é executado em, bom palpite … logout. Você pode querer parar deamons ou até mesmo fazer um pouco de limpeza. Você também pode adicionar “limpar” se quiser limpar a canvas quando sair.

Também há um acompanhamento completo em cada um dos arquivos de configurações aqui

Estas são provavelmente dependentes de distro, nem todas as distribuições optam por ter cada configuração com elas e algumas têm ainda mais. Mas quando eles têm o mesmo nome, normalmente incluem o mesmo conteúdo.

De acordo com Josh Staiger , o Terminal.app do Mac OS X na verdade executa um shell de login em vez de um shell não-login por padrão para cada nova janela de terminal, chamando .bash_profile em vez de .bashrc.

Ele recomenda:

Na maioria das vezes você não quer manter dois arquivos de configuração separados para shells de login e não-login – quando você define um PATH, você quer que ele se aplique a ambos. Você pode corrigir isso obtendo o arquivo .bashrc do seu arquivo .bash_profile e, em seguida, colocando o PATH e as configurações comuns em .bashrc.

Para fazer isso, adicione as seguintes linhas ao .bash_profile:

 if [ -f ~/.bashrc ]; then source ~/.bashrc fi 

Agora, quando você acessar sua máquina a partir de um console, o bashrc será chamado.

Um bom lugar para olhar é a man page of bash. Aqui está uma versão online. Procure a seção “INVOCATION”.

Eu usei distros da família Debian que parecem executar .profile , mas não .bash_profile , enquanto que os derivados de RHEL executam .bash_profile antes de .profile .

Parece ser uma bagunça quando você tem que configurar variables ​​de ambiente para trabalhar em qualquer sistema operacional Linux.