はじめに
zsh の ~/.zshenv,~/.zprofile などの dotfiles が呼び出される順序について整理した.ついでにシェルの呼び出され方の分類についても調べた.zsh についての話だが概ね他のシェルにも当てはまる気がする.
シェルの起動方法の分類と設定ファイルごとの実行有無
(login or non-login) × (interactive or non-interactive) の 4 パターンある.
いずれのパターンでも,その環境で有効なシェルの実行ファイル(/bin/zsh など)が実行される(実行ファイルがそれぞれあるわけではない).
起動時の操作に応じてシェルに課せられる処理は異なる(ターミナル起動時はカッコいいプロンプトを設定する必要がある一方で,シェルスクリプト実行時はその必要がない)が,各 dotfiles ではこれらの処理を,起動の仕方に応じて個別に定義する.
パターンと dotfiles 呼び出し順序を整理すると次の通り:
| - | login | non-login |
|---|---|---|
| interactive |
~/.zshenv > ~/.zprofile > ~/.zshrc > ~/.zlogin
|
~/.zshenv > ~/.zshrc
|
| non-interactive |
~/.zshenv > ~/.zprofile > ~/.zlogin
|
~/.zshenv |
login shell か interactive shell かの 2 つに 1 つ,というわけではなさそう.
起動の操作と設定ファイルごとの実行有無
各 dotfiles に echo '$ファイル名' を追記し起動の操作をいろいろ試した.
~/.zshenv 以降,表の左から順に呼び出される:
| 操作 | login shell | interective shell |
~/.zshenv |
~/.zprofile |
~/.zshrc |
~/.zlogin |
|---|---|---|---|---|---|---|
| ターミナルソフトの起動 | ○ | ○ | 🙆♂️ | 🙆♂️ | 🙆♂️ | 🙆♂️ |
tmux new |
○ | ○ | 🙆♂️ | 🙆♂️ | 🙆♂️ | 🙆♂️ |
zsh |
× | ○ | 🙆♂️ | - | 🙆♂️ | - |
su |
× | ○ | 🙆♂️ | - | 🙆♂️ | - |
| shell script 実行 | × | × | 🙆♂️ | - | - | - |
source activate による Python 仮想環境切替 |
× | × | - | - | - | - |
source activate についてはそもそもシェルは起動すらしない模様.
/etc/... 以下のファイルはそれぞれ,対応する ~ 以下のファイルの直前に呼び出されるとのこと.
login shell だが interactive shell ではない例は思いつかなかった.