The process of init a Linux user session
┌──────────────────────┐ ┌──────────────────────┐
│ 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.