今まではバカの一つ覚えのように何でもかんでも$HOME/.zshrcに書いていたけど、サーバ管理をよくするようになってきて、複数アカウントの共通設定とかをしたくなったので調べた。
順番
以下の$ZDOTDIRは指定されていない場合$HOMEになる。
ログイン時
- /etc/zshenv
- $ZDOTDIR/.zshenv
- /etc/zprofile
- $ZDOTDIR/.zprofile
- $ZDOTDIR/.zshrc
- /etc/zlogin
- $ZDOTDIR/.zlogin
ログアウト時
- $ZDOTDIR/.zlogout
- /etc/zlogout
言うまでもなく、個人的な設定は$ZDOTDIRに、汎用的な設定は/etcに書く。
各種説明
zshenv
必ず実行される。/etc/zshenvは上書き不可で$PATHや$MANPATHの設定がされる。
$ZDOTDIR/.zshenvにはいかなる場合も設定したい項目を設定する感じ。manファイルではできるだけ小さくシンプルに保つように勧めている。
sshコマンドの引数でログイン後に行うコマンドを指定すると、それだけを実行してssh接続を直ぐに切るが、そのような場合もzshenvは実行される。この場合以下のやつは全部実行されない。
zprofile
ログイン時に一回だけ実行される。なのでzshの関数の定義とかはここに書くといいのかも知れない。あと、外部の設定ファイルを読み込むのもここに書くとよさそう。
zshrc
インタラクティブシェルの時に実行される。つまり
# ログイン時は4種類とも実行される
$ zsh # 既にログインしている状態で改めてzshを起動する
# /etc/zshenv
# $HOME/.zshenv
# /etc/zshrc
# $HOME/.zshrc
$ # zprofileとzloginは実行されない
zlogin
ログイン時に一回だけ実行される。zprofileがあるのにわざわざ用意されているということはzshrcで行ったなにかしらの設定に依存するが、一回だけでいいような処理を書く場所だと思われる。イマイチそういう状況が思い浮かばないがきっとそう。
zlogout
基本的にログインシェルから抜ける時に実行される。ただし、別プロセスに明け渡す形で終了する場合(execveシステムコールを呼ぶとか?)は実行されないらしい。
利用例
例えばマルチユーザモードでrvmをインストールした場合、rvmは標準で/etc/profile.d/rvm.shを作成する。Linuxの/etc/profileでは/etc/profile.d/*.shが読み込まれるように設定されており、bashがこれを読むので、結果的にrvm.shが読み込まれるけど、zshだと読み込んでくれない。そこで/etc/zprofileに以下を追記する
for i in /etc/profile.d/*.sh ; do
[ -r $i ] && source $i
done
こうすればこのサーバでログインシェルとしてzshを使っている人全員がrvmを使えるようになる。