Unix Shell Initialization (CloudMonk.io)

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

* Linux Configuration - Unix shell initialization
* Windows Configuration - Windows Terminal initialization - PowerShell initialization
* macOS Configuration - macOS shell initialization

----

Unix shell initialization

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

* $PATH and other Unux environment variables
* shell prompt
* shell tab-completion
* shell aliases, shell functions
* shell key bindings

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:

* Unix login - e.g. when Unix user logs in to a Unix system with non-graphical interface or via SSH;
* 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

=
/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:

* Environment Variables
* path_helper(8)
* launchd.conf(5)
* pam_env(8)


Fair Use Sources


Fair Use Sources:
* https://github.com/rbenv/rbenv/wiki/unix-shell-initialization#shell-init-files