Diferença entre .bashrc e .bash_profile

409

Qual é a diferença entre .bashrc e .bash_profile e qual devo usar?

    
por cfischer 02.09.2010 / 16:40

5 respostas

479

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.

    
por 02.09.2010 / 21:23
50

Deste artigo resumido

According to the bash man page, .bash_profile is executed for login shells, while .bashrc is executed for interactive non-login shells.

What is a login or non-login shell?

When you login (eg: type username and password) via console, either physically sitting at the machine when booting, or remotely via ssh: .bash_profile is executed to configure things before the initial command prompt.

But, if you've already logged into your machine and open a new terminal window (xterm) inside Gnome or KDE, then .bashrc is executed before the window command prompt. .bashrc is also run when you start a new bash instance by typing /bin/bash in a terminal.

    
por 02.09.2010 / 16:54
34

Voltando aos velhos tempos, quando os pseudo tty não eram pseudo e, na verdade, bem, datilografados, e os UNIXes eram acessados por modems tão vagarosamente que era possível ver cada letra sendo impressa em sua tela, a eficiência era primordial. Para ajudar na eficiência, você teve um conceito de uma janela de login principal e de quaisquer outras janelas que você usou para realmente funcionar. Na sua janela principal, você gostaria de notificações para qualquer novo e-mail, possivelmente executar alguns outros programas em segundo plano.

Para suportar isso, shells originaram um arquivo .profile especificamente em 'shells de login'. Isso faria o especial, uma vez uma configuração de sessão. Bash estendeu isso um pouco para olhar para .bash_profile primeiro antes de .profile, dessa forma você poderia colocar apenas as coisas lá dentro (para que elas não estragassem o shell Bourne, etc, que também olhassem para .profile). Outros shells, non-login, apenas forneceriam o arquivo rc, .bashrc (ou .kshrc, etc).

Isso é um pouco de anacronismo agora. Você não entra em um shell principal, tanto quanto você faz login em um gerenciador de janelas GUI. Não há janela principal diferente de qualquer outra janela.

Minha sugestão - não se preocupe com essa diferença, ela é baseada em um estilo antigo de usar o unix. Elimine a diferença em seus arquivos. Todo o conteúdo de .bash_profile deve ser:

[ -f $HOME/.bashrc ] && . $HOME/.bashrc

E coloque tudo o que você realmente quer definir .bashrc

Lembre-se que o .bashrc é originado de todos os shells, interativos e não interativos. Você pode causar curto-circuito no sourcing de shells não interativos colocando este código no topo do .bashrc:

[[ $- != *i* ]] && return

    
por 02.09.2010 / 20:10
14

Dê uma olhada neste excelente post no blog por ShreevatsaR . Aqui está um extrato, mas vá para o post do blog, ele inclui uma explicação para termos como "shell de login", um fluxograma e uma tabela semelhante para o Zsh.

For Bash, they work as follows. Read down the appropriate column. Executes A, then B, then C, etc. The B1, B2, B3 means it executes only the first of those files found.

+----------------+-----------+-----------+------+
|                |Interactive|Interactive|Script|
|                |login      |non-login  |      |
+----------------+-----------+-----------+------+
|/etc/profile    |   A       |           |      |
+----------------+-----------+-----------+------+
|/etc/bash.bashrc|           |    A      |      |
+----------------+-----------+-----------+------+
|~/.bashrc       |           |    B      |      |
+----------------+-----------+-----------+------+
|~/.bash_profile |   B1      |           |      |
+----------------+-----------+-----------+------+
|~/.bash_login   |   B2      |           |      |
+----------------+-----------+-----------+------+
|~/.profile      |   B3      |           |      |
+----------------+-----------+-----------+------+
|BASH_ENV        |           |           |  A   |
+----------------+-----------+-----------+------+
|                |           |           |      |
+----------------+-----------+-----------+------+
|                |           |           |      |
+----------------+-----------+-----------+------+
|~/.bash_logout  |    C      |           |      |
+----------------+-----------+-----------+------+
    
por 13.07.2016 / 10:53
3

UM COMENTÁRIO MELHOR PARA O CHEFE DE / ETC / PERFIL

Com base na ótima resposta de Flimm acima, eu inseri este novo comentário na cabeça do meu Debian / etc / profile, (você pode precisar ajustá-lo para sua distro.) :

# For BASH: Read down the appropriate column. Executes A, then B, then C, etc.
# The B1, B2, B3 means it executes only the first of those files found.  (A)
# or (B2) means it is normally sourced by (read by and included in) the
# primary file, in this case A or B2.
#
# +---------------------------------+-------+-----+------------+
# |                                 | Interactive | non-Inter. |
# +---------------------------------+-------+-----+------------+
# |                                 | login |    non-login     |
# +---------------------------------+-------+-----+------------+
# |                                 |       |     |            |
# |   ALL USERS:                    |       |     |            |
# +---------------------------------+-------+-----+------------+
# |BASH_ENV                         |       |     |     A      | not interactive or login
# |                                 |       |     |            |
# +---------------------------------+-------+-----+------------+
# |/etc/profile                     |   A   |     |            | set PATH & PS1, & call following:
# +---------------------------------+-------+-----+------------+
# |/etc/bash.bashrc                 |  (A)  |  A  |            | Better PS1 + command-not-found 
# +---------------------------------+-------+-----+------------+
# |/etc/profile.d/bash_completion.sh|  (A)  |     |            |
# +---------------------------------+-------+-----+------------+
# |/etc/profile.d/vte-2.91.sh       |  (A)  |     |            | Virt. Terminal Emulator
# |/etc/profile.d/vte.sh            |  (A)  |     |            |
# +---------------------------------+-------+-----+------------+
# |                                 |       |     |            |
# |   A SPECIFIC USER:              |       |     |            |
# +---------------------------------+-------+-----+------------+
# |~/.bash_profile    (bash only)   |   B1  |     |            | (doesn't currently exist) 
# +---------------------------------+-------+-----+------------+
# |~/.bash_login      (bash only)   |   B2  |     |            | (didn't exist) **
# +---------------------------------+-------+-----+------------+
# |~/.profile         (all shells)  |   B3  |     |            | (doesn't currently exist)
# +---------------------------------+-------+-----+------------+
# |~/.bashrc          (bash only)   |  (B2) |  B  |            | colorizes bash: su=red, other_users=green
# +---------------------------------+-------+-----+------------+
# |                                 |       |     |            |
# +---------------------------------+-------+-----+------------+
# |~/.bash_logout                   |    C  |     |            |
# +---------------------------------+-------+-----+------------+
#
# ** (sources !/.bashrc to colorize login, for when booting into non-gui)

E esta nota na cabeça de cada um dos outros arquivos de configuração para se referir a ela:

# TIP: SEE TABLE in /etc/profile of BASH SETUP FILES AND THEIR LOAD SEQUENCE

Vale notar que eu acho que é o / etc / profile do Debian por default sources (includes) /etc/bash.bashrc (é quando o /etc/bash.bashrc existe). Portanto, os scripts de login lêem ambos os arquivos / etc, enquanto o não-login lê apenas o bash.bashrc.

Também é de notar que o /etc/bash.bashrc está configurado para não fazer nada quando não é executado de forma interativa. Então, esses dois arquivos são apenas para scripts interativos.

    
por 18.10.2016 / 20:13