┌──────────────────────┐                    ┌──────────────────────┐                     
│     Interactive?     │─────▶   No  ──────▶│    --login Flag?     │───▶  No             
└──────────────────────┘                    └──────────────────────┘                     
            │                                           │                  │             
            │                                           │                  │             
            ▼                                           │                  ▼             
                                                        │           ┌─────────────┐      
           Yes                    ┌─────────────────────┘           │  $BASH_ENV  │      
                                  │                                 └─────────────┘      
            │                     │                                                      
            │                     │                                                      
            ▼                     ▼                                                      
┌──────────────────────┐                    ┌──────────────────────┐                     
│     Login Shell?     │──────▶  Yes ──────▶│  --noprofile Flag?   │────▶  No            
└──────────────────────┘                    └──────────────────────┘                     
            │                                           │                   │            
            │                                           │                   │            
            ▼                                           │                   ▼            
                                                        │       ┌──────────────────────┐ 
           No                                           │       │     /etc/profile     │ 
                                                        │       └──────────────────────┘ 
            │                                           │                   │            
            │                                           │                   │            
            ▼                                           ▼                   │            
┌──────────────────────┐                                                    ▼            
│--rcfile <file> Flag? │──────▶  Yes                   Yes     ╔════════════════════════╗
└──────────────────────┘                                       ║                        ║
            │                     │                     │      ║ First Of:              ║
            │                     │                     │      ║  - $HOME/.bash_profile ║
            ▼                     ▼                     │      ║  - $HOME/.bash_login   ║
                           ┌─────────────┐              │      ║  - $HOME/.profile      ║
           No              │   <file>    │              │      ║                        ║
                           └─────────────┘              │      ╚════════════════════════╝
            │                                           ▼                   │            
            │                                  ╔════════════════╗                        
            ▼                                  ║                ║           │            
┌──────────────────────┐                       ║    No File     ║                        
│     --norc Flag?     │──────▶ Yes  ─────────▶║    Loaded!     ║           │            
└──────────────────────┘                       ║                ║                        
            │                                  ║                ║           │            
            │                                  ╚════════════════╝                        
            ▼                                                               │            
                                                                                         
           No                                                               │            
                                                                                         
            │                                                          May Include       
            │                                                               │            
┌──────────────────────┐               ╔══════════════════════╗             │            
│  /etc/bash/bash.rc   │──────────────▶║    $HOME/.bashrc     ║◀ ─ ─ ─ ─ ─ ─             
└──────────────────────┘               ╚══════════════════════╝                          

Invoked as an interactive login shell, or with --login When Bash is invoked as an interactive login shell, or as a non-interactive shell with the --login option, it first reads and executes commands from the file /etc/profile, if that file exists. After reading that file, it looks for ~/.bash_profile, ~/.bash_login, and ~/.profile, in that order, and reads and executes commands from the first one that exists and is readable. The --noprofile option may be used when the shell is started to inhibit this behavior.

When a login shell exits, Bash reads and executes commands from the file ~/.bash_logout, if it exists.

Invoked as an interactive non-login shell When an interactive shell that is not a login shell is started, Bash reads and executes commands from ~/.bashrc, if that file exists. This may be inhibited by using the --norc option. The --rcfile file option will force Bash to read and execute commands from file instead of ~/.bashrc.

By default, Terminal starts the shell via /usr/bin/login, which makes the shell a login shell. On every platform (not just Mac OS X) bash does not use .bashrc for login shells (only /etc/profile and the first of .bash_profile, .bash_login, .profile that exists and is readable). This is why “put source ~/.bashrc in your .bash_profile” is standard advice.

So typically (or sooner or later), what you will encounter are non-login shells. So this case is what you should write your config files for. This means putting most of your stuff in ~/.bashrc, having exactly one of ~/.bash_profile, ~/.bash_login, and ~/.profile, and sourcing ~/.bashrc from it.

On startup, bash executes any script labeled A in the table below, followed by the first script B it finds. On exit, it executes any script labeled C.

Interactive login Interactive non-login Non-interactive Remote shell
/etc/profile A
/etc/bash.bashrc A
~/.bashrc B A
~/.bash_profile B1
~/.bash_login B2
~/.profile B3
BASH_ENV A
~/.bash_logout C
Author is lost
The author of the scheme is lost :(
If you know who the author is, please let me know.