Unix shell initialization
Page Contents
Shell initialization files are ways to persist common shell configurations:
$PATH
and other environment variables- shell prompt
- shell tab-completion
- aliases, functions
- key bindings
Shell modes
Which initialization files get sourced by the shell is dependent on the combination of modes in which a particular shell process runs. There are two main, non-exclusive modes:
- login - e.g. when user logs in to a system with non-graphical interface or via SSH;
- interactive - shell that has a prompt and whose standard input and error are both connected to terminals.
These modes can be manually activated with the following flags to bash/zsh:
-l
,--login
-i
Here are some common operations and shell modes they result in:
- log in to a remote system via SSH: login + interactive
- execute a script remotely, e.g.
ssh user@host 'echo $PWD'
or with Capistrano: non‑login, non‑interactive - execute a script remotely and request a terminal, e.g.
ssh user@host -t 'echo $PWD'
: non-login, interactive - start a new shell process, e.g.
bash
: non‑login, interactive - run a script,
bash myscript.sh
: non‑login, non‑interactive - run an executable with
#!/usr/bin/env bash
shebang: non‑login, non‑interactive - open a new graphical terminal window/tab:
- on Mac OS X: login, interactive
- on Linux: non‑login, interactive
Shell init files
In order of activation:
bash
- login mode:
/etc/profile
~/.bash_profile
,~/.bash_login
,~/.profile
(only first one that exists)
- interactive non-login:
/etc/bash.bashrc
(some Linux; not on Mac OS X)~/.bashrc
- non-interactive:
- source file in
$BASH_ENV
- source file in
zsh
/etc/zshenv
~/.zshenv
- login mode:
/etc/zprofile
~/.zprofile
- interactive:
/etc/zshrc
~/.zshrc
- login mode:
/etc/zlogin
~/.zlogin
dash
- login mode:
/etc/profile
~/.profile
- interactive:
- source file in
$ENV
- source file in
fish
<install-prefix>/config.fish
/etc/fish/config.fish
~/.config/fish/config.fish
Practical guide to which files get sourced when
- Opening a new Terminal window/tab:
- bash
- OS X:
.bash_profile
or.profile
(1st found) - Linux:
.profile
(Ubuntu, once per desktop login session) +.bashrc
- OS X:
- Zsh
- OS X:
.zshenv
+.zprofile
+.zshrc
- Linux:
.profile
(Ubuntu, once per desktop login session) +.zshenv
+.zshrc
- OS X:
- bash
- Logging into a system via SSH:
- bash:
.bash_profile
or.profile
(1st found) - Zsh:
.zshenv
+.zprofile
+.zshrc
- bash:
- Executing a command remotely with
ssh
or Capistrano:- bash: source file in
$BASH_ENV
- Zsh:
.zshenv
- bash: source file in
- Remote git hook triggered by push over SSH:
- no init files get sourced, since hooks are running within a restricted shell
PATH
will be roughly:/usr/libexec/git-core:/usr/bin:/usr/bin:/bin:/usr/sbin:/sbin
Misc. things that affect $PATH
- OS X:
/etc/paths
,/etc/paths.d/*
~/.MacOSX/environment.plist
- affects all graphical programs/etc/launchd.conf
- TextMate: Preferences -> Advanced -> Shell Variables
- Linux:
/etc/environment
Final notes
This guide was tested with:
- bash 4.2.37, 4.2.39
- Zsh 4.3.11, 5.0
On these operating systems/apps:
- Mac OS X 10.8 (Mountain Lion): Terminal.app, iTerm2
- Ubuntu 12.10: Terminal
See also:
- Environment Variables
- path_helper(8)
- launchd.conf(5)
- pam_env(8)