Is there a ".bashrc" equivalent file read by all shells?
The file $HOME/.profile
is used by a number of shells, including bash, sh, dash, and possibly others.
From the bash man page:
When bash is invoked as an interactive login shell, ... 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.
csh and tcsh explicitly don't look at ~/.profile
but those shells are kinda antiquated.
~/.profile
is the right place for environment variable definitions and for non-graphical programs that you want to run when you log in (e.g. ssh-agent
, screen -m
). It is executed by your login shell if that is a Bourne-style shell (sh, ksh, bash). Zsh runs ~/.zprofile
instead, and Csh and tcsh run ~/.login
.
If you log in under an X display manager (xdm, gdm, kdm, ...), whether ~/.profile
is run depends how your display manager and perhaps desktop environment were configured by your distribution. If you log in under a “custom session”, that usually executes ~/.xsession
.
~/.bashrc
is the right place for bash-specific settings, such as aliases, functions, shell options and prompts. As the name indicates, it is specific to bash; csh has ~/.cshrc
, ksh has ~/.kshrc
, and zsh has <drumroll> ~/.zshrc
.
See also:
- Difference between
.bashrc
and.bash_profile
- Which setup files should be used for setting up environment variables with bash?
- Zsh not hitting
~/.profile
There is no common file, but you can make every shell read from a common file.
bash
reads from.bash_profile
or.bashrc
zsh
reads from.zprofile
and.zshrc
ksh
reads from.profile
or$ENV
So here's what I do:
~/.env
# Put environment variables here, e.g.
PATH=$PATH:$HOME/bin
~/.shrc
test -f "$HOME/.env" && . "$HOME/.env"
# Put interactive shell setup here, e.g.
alias ll='ls -l'
PS1='$PWD$ '
set -o emacs
~/.bashrc
test -f ~/.shrc && source ~/.shrc
# Put any bash-specific settings here, e.g.
HISTFILE=~/.bash_history
shopt -s extglob
IGNOREEOF=yes
~/.zshenv
# Put any zsh-specific settings for non-interactive and interactive sessions, e.g.
setopt braceexpand
setopt promptsubst
setopt shwordsplit
~/.zshrc
test -f ~/.shrc && source ~/.shrc
# Put any zsh-specific interactive settings here, e.g.
HISTFILE=~/.zsh_history
setopt ignoreeof
~/.profile
# Interactive sub-shells source .env, unless this is bash or zsh,
# because they already sourced .env in .bashrc or .zshrc.
if test -z "$BASH_VERSION" -a -z "$ZSH_VERSION" || test -n "$BASH_VERSION" -a \( "${BASH##*/}" = "sh" \)
then
test -f "$HOME"/.env && . "$HOME"/.env
fi
# The name is confusing, but $ENV is ksh's config file for interactive sessions,
# so it's equivalent to .bashrc or .zshrc.
# Putting this here makes running an interactive ksh from any login shell work.
test -f "$HOME"/.shrc && export ENV="$HOME"/.shrc
# Put any login shell specific commands here, e.g.
ssh-add
stty -ixon
~/.bash_profile
source ~/.bashrc
source ~/.profile
~/.zlogin
# zsh sources .zshrc automatically, only need to source .profile
source ~/.profile
~/.zprofile
(empty)
If you have root access to the system, another way is to set up pam_env
.
You can put
session optional pam_env.so user_envfile=.env
in the relevant /etc/pam.d
file (e.g. /etc/pam.d/common-session
on Debian), and then when the user logs in, PAM
will read environment variables from ~/.env
.
Note that pam_env
basically only supports VAR=value
entries.
More info:
- pam_env