-
Notifications
You must be signed in to change notification settings - Fork 1.4k
Unix shell initialization
Mislav Marohnić edited this page Jun 26, 2019
·
16 revisions
Shell initialization files are ways to persist common shell configuration, such as:
-
$PATH
and other environment variables - shell prompt
- shell tab-completion
- aliases, functions
- key bindings
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
In order of activation:
-
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
/etc/zshenv
~/.zshenv
-
login mode:
/etc/zprofile
~/.zprofile
-
interactive:
/etc/zshrc
~/.zshrc
-
login mode:
/etc/zlogin
~/.zlogin
-
login mode:
/etc/profile
~/.profile
-
interactive:
- source file in
$ENV
- source file in
<install-prefix>/config.fish
/etc/fish/config.fish
~/.config/fish/config.fish
- 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
- 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
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)