unix_shell_initialization

Unix Shell Initialization

Shell modes

Shell modes: Which Unix shell initialization files get sourced by the Unix shell is dependent on the combination of Unix shell modes in which a particular xNIX shell process runs. There are two main, non-exclusive modes:

These modes can be manually activated with the following flags to bash/zsh:

Here are some common operations and Unix 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

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

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 Zsh OS X: .zshenv + .zprofile + .zshrc Linux: .profile (Ubuntu, once per desktop login session) + .zshenv + .zshrc

Logging into a system via SSH: bash: .bash_profile or .profile (1st found) Zsh: .zshenv + .zprofile + .zshrc

Executing a command remotely with ssh or Capistrano: bash: source file in $BASH_ENV Zsh: .zshenv

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:

Fair Use Sources

unix_shell_initialization.txt · Last modified: 2021/10/07 13:37 by 127.0.0.1