Help us understand the problem. What is going on with this article?

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

More than 5 years have passed since last update.

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

yuku_t
FLYWHEEL社でソフトウェアエンジニアをしています。昔はIncrements社最初の従業員としてQiitaを開発したりCTOやったりしていました。
http://yuku.takahashi.coffee
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away