今まではバカの一つ覚えのように何でもかんでも$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を使えるようになる。