Pergunta

Eu usei vários sistemas diferentes baseados em *nix ao longo dos anos e parece que cada versão do Bash que 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 .bashrc, .bash_profile, e .environment?Eu também vi outros arquivos, como .login, .bash_login, e .profile;isso é sempre relevante?Quais são as diferenças em quais deles são executados ao fazer login fisicamente, fazer login remotamente via ssh e abrir uma nova janela de terminal?Existem diferenças significativas entre plataformas (incluindo Mac OS X (e seu Terminal.app) e Cygwin Bash)?

Foi útil?

Solução

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 faz login no console de texto de uma máquina Unix local).estes 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 aqueles conectados a um terminal (ou pseudo-terminal no caso de, digamos, um emulador de terminal rodando em um sistema de janelas).estes são aqueles com nomes como .bashrc, .tcshrc, .zshrc, etc.

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

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

Outros shells se comportam de maneira diferente - por exemplo, com zsh, .zshrc é sempre lido para um shell interativo, seja de 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 máquinas.

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

Outras dicas

Isso é simples.Está 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

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

Leia também o INVOCATION capítulo do manual.Diz "Os parágrafos a seguir descrevem como o bash executa seus arquivos de inicialização.", acho que é certo :) Ele explica o que é um shell "interativo" também.

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

Classicamente, ~/.profile é usado pelo Bourne Shell e provavelmente é suportado pelo Bash como uma medida legada.De novo, ~/.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 ~/.bashrc O script é lido toda vez que um shell é iniciado.Isto é análogo a /.cshrc para casca C.

Uma consequência é que as coisas em ~/.bashrc deve ser o mais leve (mínimo) possível para reduzir a sobrecarga ao iniciar um shell sem login.

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

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

.bash_profile é executado quando você login.Coisas que você coloca lá podem haver seu caminho e outras variáveis ​​de ambiente importantes.

.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 a esse usuário ou simplesmente chamando o Bash novamente) Você pode querer colocar aliases lá, mas novamente não tenho certeza do que isso significa.Eu simplesmente ignoro.

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

Há também .bash_logout wich executa em, sim, bom adivinhe ... logout.Você pode querer parar Deamons ou até mesmo fazer uma pequena tarefa doméstica.Você também pode adicionar "limpo" lá se quiser limpar a tela ao fazer o logon.

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

Provavelmente são dependentes da distribuição, nem todas as distros optam por ter cada configuração com elas e algumas têm ainda mais.Mas quando têm o mesmo nome, geralmente 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 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 login e shells que não são de login-quando você define um caminho, deseja que ele se aplique a ambos.Você pode corrigir isso adquirindo .bashrc no seu arquivo .bash_profile e depois colocando o caminho e as configurações comuns no .bashrc.

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

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

Agora, quando você faz login na sua máquina a partir de um console .bashrc será chamado.

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

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

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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top