mirror of https://github.com/bjeanes/dotfiles.git
145 lines
4.1 KiB
Markdown
145 lines
4.1 KiB
Markdown
|
# Unix shell initialization
|
|||
|
|
|||
|
(NOTE: taken from https://github.com/sstephenson/rbenv/wiki/Unix-shell-initialization)
|
|||
|
|
|||
|
Shell initialization files are ways to persist common shell configuration, such
|
|||
|
as:
|
|||
|
|
|||
|
* `$PATH` and other environment variables
|
|||
|
* shell prompt
|
|||
|
* shell tab-completion
|
|||
|
* aliases, functions
|
|||
|
* key bindings
|
|||
|
|
|||
|
|
|||
|
## Shell modes
|
|||
|
|
|||
|
Which initialization files get sourced by the shell is dependent on the
|
|||
|
combination of modes in which a particular shell process runs. There are two
|
|||
|
main, non-exclusive modes:
|
|||
|
|
|||
|
* **login** - e.g. when user logs in to a system with non-graphical interface or
|
|||
|
via SSH;
|
|||
|
* **interactive** - shell that has a prompt and whose standard input and error
|
|||
|
are both connected to terminals.
|
|||
|
|
|||
|
These modes can be manually activated with the following flags to bash/zsh:
|
|||
|
|
|||
|
* `-l`, `--login`
|
|||
|
* `-i`
|
|||
|
|
|||
|
Here are some common operations and 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
|
|||
|
|
|||
|
1. **login** mode:
|
|||
|
1. `/etc/profile`
|
|||
|
2. `~/.bash_profile`, `~/.bash_login`, `~/.profile` (only first one that exists)
|
|||
|
2. interactive **non-login**:
|
|||
|
1. `/etc/bash.bashrc` (some Linux; not on Mac OS X)
|
|||
|
2. `~/.bashrc`
|
|||
|
3. **non-interactive**:
|
|||
|
1. source file in `$BASH_ENV`
|
|||
|
|
|||
|
### Zsh
|
|||
|
|
|||
|
1. `/etc/zshenv`
|
|||
|
2. `~/.zshenv`
|
|||
|
3. **login** mode:
|
|||
|
1. `/etc/zprofile`
|
|||
|
2. `~/.zprofile`
|
|||
|
4. **interactive**:
|
|||
|
1. `/etc/zshrc`
|
|||
|
2. `~/.zshrc`
|
|||
|
5. **login** mode:
|
|||
|
1. `/etc/zlogin`
|
|||
|
2. `~/.zlogin`
|
|||
|
|
|||
|
### [dash][]
|
|||
|
|
|||
|
1. **login** mode:
|
|||
|
1. `/etc/profile`
|
|||
|
2. `~/.profile`
|
|||
|
2. **interactive**:
|
|||
|
1. source file in `$ENV`
|
|||
|
|
|||
|
### [fish][]
|
|||
|
|
|||
|
1. `<install-prefix>/config.fish`
|
|||
|
2. `/etc/fish/config.fish`
|
|||
|
3. `~/.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**: `.bashrc`
|
|||
|
* **Zsh**: `.zshenv`
|
|||
|
* Remote git hook triggered by push over SSH:
|
|||
|
* *no init files* get sourced, since hooks are running [within a restricted shell](http://git-scm.com/docs/git-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`][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](https://help.ubuntu.com/community/EnvironmentVariables)
|
|||
|
* path_helper(8)
|
|||
|
* launchd.conf(5)
|
|||
|
* pam_env(8)
|
|||
|
|
|||
|
|
|||
|
[Capistrano]: https://github.com/capistrano/capistrano/wiki
|
|||
|
[dash]: http://gondor.apana.org.au/~herbert/dash/
|
|||
|
[fish]: http://ridiculousfish.com/shell/user_doc/html/index.html#initialization
|
|||
|
[plist]: http://developer.apple.com/library/mac/#documentation/MacOSX/Conceptual/BPRuntimeConfig/Articles/EnvironmentVars.html#//apple_ref/doc/uid/20002093-113982
|