What is a login shell
and interactive shell
, and what is a .bash_profile
and .bashrc
?
An interactive shell is one started without non-option arguments, unless -s is specified, without specifying the -c option, and whose input and error output are both connected to terminals (as determined by isatty(3)), or one started with the -i option.
An interactive shell generally reads from and writes to a user’s terminal.
A login shell is a shell where you login. You can recognize a login shell from a ps -f
listing, it will have a hyphen at the start of the program name, for example:
root 3561 3553 0 09:38 pts/0 00:00:00 -bash
qa 7327 3432 0 10:46 pts/1 00:00:00 -bash
An interactive shell is one which reads commands from it's standard-input, usually a terminal.
For example, if you login to bash using an xterm or terminal emulator like putty
, then the session is both a login shell and an interactive one. If you then type bash
then you enter an interactive shell, but it is not a login shell.
If a shell script (a file containing shell commands) is run, then it is neither a login shell nor an interactive one.
Start-up files are highly tailorable in bash:
When a login bash shell is invoked, then /etc/profile
is sourced (executed in the current environment). After that, three files are checked for existence. The checks for these files are done in this order:
if /etc/profile
exists, source (run) it
if ~/.bash_profile
exists, source (run) it
if ~/.bash_login
exists, source (run) it
if ~/.profile
exists, source (run) it
Once a match is found, the other files are ignored, even if they exist. The /etc/bashrc
file might be used by both the ~/.bash_profile
and the ~/.bashrc
files. That would mean that the /etc/bashrc
file is sourced on all interactive invocations of bash, whether it is a login or non-login shell.
So, the .bashrc
file is also run every time you request a new interactive shell. This does not include a shell script. Normally variables, aliases or functions are placed in this file.
Bash shell scripts read a different file if suitably instructed. If the user defines (usually in their own .bash_profile
) a variable BASH_ENV
which contains a filename, scripts will read this. If this variable is not set (and exported) then bash scripts will not read any startup files.