Table of Contents
Unix Shell Initialization
Linux Shell Initialization - Shell Initialization
Return to Config, Configuring, Installation, Setup, Deployment, Configuration, Configuration management, Terraform, Ansible, Chef, Puppet, ARM Templates, CloudFormation
Shell initialization files are ways to persist common shell configuration, such as:
- $PATH and other Unux environment variables
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:
- interactive - Unix shell that has a Unix prompt and whose Unix standard input and Unix standard error are both connected to Unix terminals.
These modes can be manually activated with the following flags to bash/zsh:
- -l, –login
- -i
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:
- path_helper(8)
- launchd.conf(5)
- pam_env(8)