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