Notes on shell initialization
Different shells read different files when starting up. I'm collecting
here the behavior of the shells I'm exposed to. I'm not interested here
in the system files (like /etc/profile
) which could be read
as I don't have any control over them.
Kinds of shells
Shells can be invoked in different circumstances. To serve as interactive comman interpreters, to execute scripts, to execute commands passed as argument. Two aspects are considered for the reading of initialization files: is the shell a login shell? and is the shell interactive?
Login shells
Login shells are usually those whose first argument (the one which
contains the program name) starts wioth a -
or which are
passed a -l
option. The former is done automatically when
doing a console or network login. Terminal emulator can usually be
configured to launch a login shell or not (for
instance xterm
launches a login shell if passed
an -ls
option).
Login with a X display manager usually do not go through a login shell
but the display managers have their own set up files. Sometimes they try
to emulate the reading of the shell login file, with more or less
success. Two examples, on the Ubuntu version I'm currently using and
with the display manager I'm currently using, the set up is
reading $HOME/.profile
and does not try anything else
whatever you shell is. On Solaris years ago, the setup was able to
read $HOME/.login
if your shell was csh
. Some
window managers do not try to read the shell login setup file and are
only using only their own user setup files such
as $HOME/.xsession
, $HOME/.xinitrc
or $HOME/.xprofile
. The complexity is even worse as this
process is usually heavily customizable and distribution integrators do
take advantage of that, so the help that you can find on the web may not
apply to your version of your distribution.
When a shell is a login shell, the common practice is to define the
environment variables which will be inherited by all programs launched
directly or indirectly by the shell. Some other things which can be set
there is umask
, the settings of terminal
(with stty
). Before display manager and their graphical
login, it was also common to launch the X environment.
Interactive shells
Interactive shells are usually those which are reading the commands from standard input with standard input connected to a terminal. Shells usually have slightly different behavior for interactive shells such as printing a prompt before each command and not exiting in presence of errors. There may be options which change that behavior.
The common practice for the interactive shell initialization file is to define things which are useful only in these situations such as the prompt, functions and aliases for common commands, configurating the auto-completion of the shell if there is one.
Some also like to define the environment variables in the same way as for a login shell. Depending on what is defined, that can interfere with some shell usages.
Shells behavior
Posix shell
Posix doesn't specify anything to be read for login shell.
The ENV
environment variable is used, after parameter
expansion, to specify a file which is read when and only when an
interactive shell is invoked.
dash
.profile
is read for login shells.
$ENV
is read for interactive shells, included login
one. ENV
can be set in .profile
.
NetBSD sh
.profile
is read for login shells.
$ENV
is read for all shells, interactive or not, included
login one. ENV
can be set
in .profile
. Reading of $ENV
may be avoided by
setting the posix option.
bash
the first of .bash_profile
, .bash_login
,
or .profile
is read for login shells.
.bashrc
is read for interactive non-login shell.
$BASH_ENV
is read for non-interactive shells.
When invoked as sh
, bash
only looks
at .profile
for login shell, and at $ENV
for
interactive one.
ksh
.profile
is read for login shells.
$ENV
, or .kshrc
if it does not exist, is read
for interactive shells.
zsh
.zshenv
is read for all shells.
.zprofile
is read for login shells.
.zshrc
is read for interactive shells.
.zlogin
is read for login shells.
When invoked as sh
or ksh
, zsh
reads .profile
for login shells, and $ENV
for
interactive one.
mksh
.profile
is read for login shells.
$ENV
, or .mkshrc
if it does not exist, is read
for interactive shells
csh
.cshrc
is read for all shells. prompt
is set
only for interactive shells. Some systems have a which
commands which read .cshrc
with prompt
set to
an empty string.
.login
is read for login shells.
tcsh
.tcshrc
, or .cshrc
if it does not exist, is
read for all shells. prompt
is set only for interactive
shells. Some systems have a which
commands which
read .cshrc
with prompt
set to an empty
string.
.login
is read for login shells.