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

130

Eu usei vários sistemas diferentes baseados em * nix dos anos e parece que todo tipo de Bash que eu uso tem um algoritmo diferente para decidir quais scripts de inicialização serão executados. Para fins de tarefas como configurar variáveis ​​de ambiente e aliases e imprimir mensagens de inicialização (por exemplo, MOTDs), qual script de inicialização é o local apropriado para fazer isso?

Qual é a diferença entre colocar as coisas em .bashrc, .bash_profilee .environment? Eu também vi outros arquivos, como .login, .bash_login, e .profile; são sempre relevantes? Quais são as diferenças em quais são executadas ao efetuar o 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)?

Adam Rosenfield
fonte

Respostas:

73

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

Então você tem arquivos de configuração que são lidos por shells "interativos" (como aqueles conectados a um terminal (ou pseudo-terminal no caso de, por exemplo, um emulador de terminal rodando sob um sistema de janelas). Esses são os que têm nomes como .bashrc, .tcshrc, .zshrc, etc.

bashcomplica isso, que .bashrcé lido apenas por um shell que é interativo e sem logon , então você verá que a maioria das pessoas acaba dizendo .bash_profilepara que também leiam .bashrccom algo como

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

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

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

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

Cos
fonte
48

Isso é simples. É explicado em 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

Os shells de login são aqueles que são lidos nos quais você faz login (portanto, eles não são executados ao iniciar o xterm, por exemplo). Existem outras maneiras de fazer login. Por exemplo, usando um gerenciador de exibição X. Essas possuem outras maneiras de ler e exportar variáveis ​​de ambiente no momento do login.

Leia também o INVOCATIONcapítulo no manual. Ele diz "Os parágrafos a seguir descrevem como o bash executa seus arquivos de inicialização". , acho que é um ponto :) Explica o que é um shell "interativo" também.

Bash não conhece .environment. Eu suspeito que seja um arquivo da sua distribuição, para definir variáveis ​​de ambiente independentes do shell que você dirige.

Johannes Schaub - litb
fonte
1
Você poderia adicionar /etc/bashrcpara preencher a resposta?
Nemoden
9

Classicamente, ~/.profileé usado pelo Bourne Shell e provavelmente é suportado pelo Bash como uma medida herdada. Novamente, ~/.logine ~/.cshrcforam usados ​​pelo C Shell - não tenho certeza de que o Bash os use.

O ~/.bash_profileseria usado uma vez, no login. O ~/.bashrcscript é lido toda vez que um shell é iniciado. Isso é análogo ao /.cshrcC Shell.

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

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

Jonathan Leffler
fonte
7

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

.bash_profile é executado quando você faz login. O material que você coloca lá pode ser seu PATH e outras variáveis ​​importantes do ambiente.

.bashrc é usado para shells sem 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 este usuário ou simplesmente chama o bash novamente). Você pode colocar aliases lá, mas novamente não tenho certeza do que isso significa. Eu simplesmente o ignoro.

.profile é o equivalente a .bash_profile para a raiz. Eu acho que o nome foi alterado para permitir que outros 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, sim, bom palpite ... logout. Você pode querer parar com os daeam ou até fazer uma pequena limpeza. Você também pode adicionar "limpar" lá se quiser limpar a tela ao sair.

Também há um acompanhamento completo de cada um dos arquivos de configuração aqui

Provavelmente, elas dependem da distribuição, nem todas as distribuições escolhem ter cada configuração com elas e algumas têm ainda mais. Mas quando eles têm o mesmo nome, geralmente incluem o mesmo conteúdo.

Filip Ekberg
fonte
4

De acordo com Josh Staiger , o Terminal.app do Mac OS X realmente executa um shell de login em vez de um shell sem 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 deseja manter dois arquivos de configuração separados para shells de login e não-logon - quando você define um PATH, deseja que ele se aplique a ambos. Você pode corrigir isso utilizando o .bashrc do arquivo .bash_profile e colocando PATH e 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ê fizer login na sua máquina a partir de um console, o .bashrc será chamado.

Rose Perrone
fonte
2

Um bom lugar para se olhar é a página de manual do bash. Aqui está uma versão online. Procure a seção "INVOCATION".

PolyThinker
fonte
0

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

Parece uma bagunça quando você precisa configurar variáveis ​​de ambiente para funcionar em qualquer sistema operacional Linux.

sismico
fonte