Bash configuration filesEdit
This is my attempt to phrase the "INVOCATION" section of the Bash man page in the clearest possible terms.
Definitions
A "login" shell is:
- a shell whose argument zero starts with
-; or - a shell invoked with the
--loginor-l(equivalent) option
Examples of login shells:
- the shell you get when you:
- open a new terminal window
- open a new tab in a terminal window
- open a new pane in a tmux session
Note: This behavior may vary according to your terminal program; it is true for Mac OS X, but this article claims the behavior is the opposite in some Linux distros.
An "interactive" shell may be:
- a login shell as described above; or
- any other shell whose standard input and output are connected to a real terminal (ie. the kind of shell you get if you type
bashorsh) - a shell started with
-i
A "non-interactive" shell may be:
- a shell started to run a shell script
- a shell started to run a command (eg.
sh -c ls)
Startup behavior
sh:
- run as an interactive login shell (unless inhibited with the
--no-profile option):
- runs
/etc/profile
- runs
~/.profile, if it exists
- run as an interactive non-login shell (eg. if you just type
sh)
- runs nothing
- run as a non-interactive shell with the
--login or -l options:
- runs
/etc/profile
- runs
~/.profile, if it exists
bash:
- run as an interactive login shell (unless inhibited with the
--no-profile option):
- runs
/etc/profile
- runs first found, readable file among
~/.bash_profile, ~/.bash_login and ~/.profile
- runs
~/.bash_logout, if present, on logout
- run as an interactive non-login shell (eg. if you just type
bash):
- runs
~/.bashrc (unless inhibited with the --no-rc option)
- run as a non-interactive shell with the
--login or -k options:
- runs
/etc/profile
- runs first found, readable file among
~/.bash_profile, ~/.bash_login and ~/.profile
- runs
~/.bash_logout, if present, on logout
- run as a non-interactive shell (eg.
bash -c ls):
- runs nothing
Consequences
- For most intents and purposes, you can count on
~/.bash_profile (or similar) running for pretty much any shell you open.
- It’s recommended that you put base config (things like
PATH exports) in your ~/.bashrc and fancy stuff (prompt set-up etc) in your ~/.bash_profile; you can source you ~/.bashrc from your ~/.bash_profile to that you don’t have to duplicate the basic config
See also
sh:
- run as an interactive login shell (unless inhibited with the
--no-profileoption):- runs
/etc/profile - runs
~/.profile, if it exists
- runs
- run as an interactive non-login shell (eg. if you just type
sh)- runs nothing
- run as a non-interactive shell with the
--loginor-loptions:- runs
/etc/profile - runs
~/.profile, if it exists
- runs
bash:
- run as an interactive login shell (unless inhibited with the
--no-profileoption):- runs
/etc/profile - runs first found, readable file among
~/.bash_profile,~/.bash_loginand~/.profile - runs
~/.bash_logout, if present, on logout
- runs
- run as an interactive non-login shell (eg. if you just type
bash):- runs
~/.bashrc(unless inhibited with the--no-rcoption)
- runs
- run as a non-interactive shell with the
--loginor-koptions:- runs
/etc/profile - runs first found, readable file among
~/.bash_profile,~/.bash_loginand~/.profile - runs
~/.bash_logout, if present, on logout
- runs
- run as a non-interactive shell (eg.
bash -c ls):- runs nothing
- For most intents and purposes, you can count on
~/.bash_profile(or similar) running for pretty much any shell you open. - It’s recommended that you put base config (things like
PATHexports) in your~/.bashrcand fancy stuff (prompt set-up etc) in your~/.bash_profile; you can source you~/.bashrcfrom your~/.bash_profileto that you don’t have to duplicate the basic config