Diferença entre .bashrc e .bash_profile
Qual é a diferença entre .bashrce .bash_profilee qual devo usar?
Respostas
Tradicionalmente, quando você faz login 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ê os comandos de ~/.profilequando é chamado como o shell de login.
Bash é uma concha tipo Bourne. Ele lê os comandos de ~/.bash_profilequando é chamado como o shell de login e, se o 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 lê ~/.profile. Quando você inicia o bash como um shell interativo (ou seja, para não executar um script), ele lê ~/.bashrc(exceto quando chamado como um shell de login, então ele apenas lê ~/.bash_profileou ~/.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 os programas gráficos, eles vão para um arquivo diferente) e definições de variáveis de ambiente.~/.bashrcé o lugar para colocar coisas que se aplicam apenas ao próprio bash, como alias e definições de função, opções de shell e configurações de prompt. (Você também pode colocar atalhos de teclado lá, mas para o bash eles normalmente entram~/.inputrc.)~/.bash_profilepode ser usado em vez de~/.profile, mas é lido apenas pelo bash, e não por qualquer outro shell. (Isso é principalmente uma preocupação se você deseja que seus arquivos de inicialização funcionem em várias máquinas e seu shell de login não seja bash em todas elas.) Este é um lugar lógico para incluir~/.bashrcse o shell for interativo. Recomendo os seguintes conteúdos 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 no qual você digita sua senha estiver executando em modo gráfico), você não obterá automaticamente um shell de login que lê ~/.profile. Dependendo do programa de login gráfico, do gerenciador de janelas ou ambiente de área de trabalho executado posteriormente e de como sua distribuição configurou esses programas, você ~/.profilepode ou não ser lido. Se não for, geralmente há outro lugar onde você pode definir variáveis de ambiente e programas para iniciar quando você faz o login, mas infelizmente não há um local padrão.
Observe que você pode ver aqui e ali recomendações para inserir definições de variáveis de ambiente ~/.bashrcou sempre iniciar shells de login nos terminais. Ambos são ideias 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, a pedido: se .bash_profilenão existir, o bash também tenta .bash_loginantes de retornar .profile. Sinta-se à vontade para esquecer que existe. 
Deste pequeno artigo
De acordo com a página de manual do bash, .bash_profile é executado para shells de login, enquanto .bashrc é executado para shells de não login interativos.
O que é um shell de login ou não de login?
Quando você faz o login (por exemplo: digite nome de usuário e senha) via console, fisicamente sentado na máquina durante a inicialização, ou remotamente via ssh: .bash_profile é executado para configurar as coisas antes do prompt de comando inicial.
Mas, se você já se logou em sua máquina e abriu uma nova janela de terminal (xterm) dentro do Gnome ou KDE, então .bashrc é executado antes do prompt de comando da janela. .bashrc também é executado quando você inicia uma nova instância do bash digitando / bin / bash em um terminal.
Antigamente, quando os pseudo tty's não eram pseudo e, na verdade, bem, eram digitados e os UNIXes eram acessados por modems tão lentos que você podia ver cada letra sendo impressa na tela, a eficiência era fundamental. Para ajudar um pouco a eficiência, você tinha um conceito de janela de login principal e quaisquer outras janelas que costumava trabalhar. Em sua janela principal, você gostaria de receber notificações sobre qualquer novo e-mail, possivelmente executar alguns outros programas em segundo plano.
Para suportar isso, os shells forneceram um arquivo .profileespecificamente em 'shells de login'. Isso faria o especial, uma vez que uma configuração de sessão. O Bash estendeu isso um pouco para olhar para .bash_profile primeiro antes de .profile, desta forma você poderia colocar bash apenas coisas lá (para que eles não estragassem o Bourne shell, etc, que também olhava para .profile). Outros shells, sem login, apenas forneceriam o arquivo rc, .bashrc (ou .kshrc, etc).
Isso é um pouco anacronismo agora. Você não se loga em um shell principal tanto quanto se loga 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 uso do 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 deseja definir em .bashrc
Lembre-se de que .bashrc é fornecido para todos os shells, interativos e não interativos. Você pode causar um curto-circuito na origem de shells não interativos colocando este código próximo ao topo de .bashrc:
[[ $- != *i* ]] && return
Dê uma olhada neste excelente post de blog de ShreevatsaR . Aqui está um trecho, mas vá para a postagem do blog, ele inclui uma explicação para termos como "shell de login", um fluxograma e uma tabela semelhante para Zsh.
Para o Bash, eles funcionam da seguinte maneira. Leia a coluna apropriada. Executa A, B, C, etc. O B1, B2, B3 significa que ele executa apenas o primeiro dos arquivos encontrados.
+----------------+-----------+-----------+------+
|                |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      |           |      |
+----------------+-----------+-----------+------+
UM COMENTÁRIO MELHOR PARA O CABEÇA DE / ETC / PERFIL
Com base na grande resposta de Flimm acima, I inserido este novo comentário na cabeça do meu Debian /etc/profile, (pode ser necessário 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 observação no início de cada um dos outros arquivos de configuração para se referir a ele:
# TIP: SEE TABLE in /etc/profile of BASH SETUP FILES AND THEIR LOAD SEQUENCE
 
     Vale a pena notar, eu acho, que /etc/profileas fontes padrão do Debian (inclui) /etc/bash.bashrc, (isso é quando /etc/bash.bashrcexiste). Assim, os scripts de login lêem os dois /etcarquivos, enquanto o não login lê apenas bash.bashrc.
Também digno de nota é que /etc/bash.bashrcestá configurado para não fazer nada quando não é executado interativamente. Portanto, esses dois arquivos são apenas para scripts interativos.
A lógica de configuração do bash's em si não é muito complicada e explicada em outras respostas nesta página, no serverfault e em muitos blogs. O problema, entretanto, é o que as distribuições Linux fazem do bash , quero dizer, as formas complexas e variadas que configuram o bash por padrão.http://mywiki.wooledge.org/DotFilesmenciona algumas dessas peculiaridades brevemente. Aqui está um exemplo de rastreamento no Fedora 29, ele mostra quais arquivos originam quais outros arquivos e em que ordem para um cenário muito simples: conectar-se remotamente com ssh e, em seguida, iniciar outro subshell:
ssh fedora29
 └─ -bash # login shell
      ├── /etc/profile
      |    ├─ /etc/profile.d/*.sh
      |    ├─ /etc/profile.d/sh.local
      |    └─ /etc/bashrc
      ├── ~/.bash_profile
      |    └─ ~/.bashrc
      |          └─ /etc/bashrc
      |
      |
      └─ $ bash  # non-login shell
            └─ ~/.bashrc
                 └─ /etc/bashrc
                       └─ /etc/profile.d/*.sh
 
     A lógica mais complexa do Fedora está em /etc/bashrc. Como visto acima, /etc/bashrcé um arquivo que o próprio bash não conhece, quero dizer, não diretamente. O Fedora /etc/bashrctesta se:
- está sendo fornecido por um shell de login,
 - está sendo fornecido por um shell interativo,
 - já foi adquirido
 
... e então faz coisas completamente diferentes dependendo disso.
Se você acha que consegue se lembrar do gráfico acima, é uma pena, porque não é suficiente: este gráfico apenas descreve apenas um cenário, coisas ligeiramente diferentes acontecem ao executar scripts não interativos ou iniciar uma sessão gráfica. Eu omiti ~/.profile. Omiti bash_completionscripts. Por motivos de compatibilidade com versões anteriores, invocar bash as em /bin/shvez de /bin/bashalterar seu comportamento. E quanto ao zsh e outros shells? E, claro, distribuições Linux diferentes fazem as coisas de maneira diferente, por exemplo, Debian e Ubuntu vêm com uma versão não padrão do bas h, com customização (ões) específica (s) para o Debian. Nomeadamente procura um arquivo incomum: /etc/bash.bashrc. Mesmo se você se limitar a uma única distribuição Linux, provavelmente ela evolui com o tempo. Espere: nós nem tocamos no macOS, no FreeBSD, ... Finalmente, vamos ter uma ideia para os usuários que estão presos às maneiras ainda mais criativas de seus administradores configurarem o sistema que devem usar.
Como o fluxo interminável de discussões sobre este tópico demonstra, é uma causa perdida. Contanto que você apenas queira adicionar novos valores, algumas "tentativas e erros" tendem a ser suficientes. A verdadeira diversão começa quando você deseja modificar em um arquivo (do usuário) algo já definido em outro (em / etc). Então, esteja preparado para gastar algum tempo projetando uma solução que nunca será portátil.
Para se divertir um pouco, aqui está o "gráfico de origem" para o mesmo cenário simples no Clear Linux em junho de 2019:
ssh clearlinux
 └─ -bash # login shell
      ├── /usr/share/defaults/etc/profile
      |    ├─ /usr/share/defaults/etc/profile.d/*
      |    ├─ /etc/profile.d/*
      |    └─ /etc/profile
      ├── ~/.bash_profile
      |
      |
      └─  $ bash   # non-login shell
           ├─ /usr/share/defaults/etc/bash.bashrc
           |      ├─ /usr/share/defaults/etc/profile
           |      |    ├─ /usr/share/defaults/etc/profile.d/*
           |      |    ├─ /etc/profile.d/*
           |      |    └─ /etc/profile
           |      └─ /etc/profile
           └─ ~/.bashrc