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


Unix shell initialization

Shell initialization files are ways to persist common shell configuration, such as:

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:

On these operating systems/apps:

See also:

Fair Use Sources

Fair Use Sources: