zshでログイン・ログアウト時に実行されるファイル

  • 181
    いいね
  • 0
    コメント
この記事は最終更新日から1年以上が経過しています。

今まではバカの一つ覚えのように何でもかんでも$HOME/.zshrcに書いていたけど、サーバ管理をよくするようになってきて、複数アカウントの共通設定とかをしたくなったので調べた。

順番

以下の$ZDOTDIRは指定されていない場合$HOMEになる。

ログイン時

  1. /etc/zshenv
  2. $ZDOTDIR/.zshenv
  3. /etc/zprofile
  4. $ZDOTDIR/.zprofile
  5. $ZDOTDIR/.zshrc
  6. /etc/zlogin
  7. $ZDOTDIR/.zlogin

ログアウト時

  1. $ZDOTDIR/.zlogout
  2. /etc/zlogout

言うまでもなく、個人的な設定は$ZDOTDIRに、汎用的な設定は/etcに書く。

各種説明

zshenv

必ず実行される。/etc/zshenvは上書き不可で$PATH$MANPATHの設定がされる。
$ZDOTDIR/.zshenvにはいかなる場合も設定したい項目を設定する感じ。manファイルではできるだけ小さくシンプルに保つように勧めている。
sshコマンドの引数でログイン後に行うコマンドを指定すると、それだけを実行してssh接続を直ぐに切るが、そのような場合もzshenvは実行される。この場合以下のやつは全部実行されない。

zprofile

ログイン時に一回だけ実行される。なのでzshの関数の定義とかはここに書くといいのかも知れない。あと、外部の設定ファイルを読み込むのもここに書くとよさそう。

zshrc

インタラクティブシェルの時に実行される。つまり

zsh
# ログイン時は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に以下を追記する

/etc/zprofile
for i in /etc/profile.d/*.sh ; do
    [ -r $i ] && source $i
done

こうすればこのサーバでログインシェルとしてzshを使っている人全員がrvmを使えるようになる。