210
206

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Last updated at Posted at 2012-04-16

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

210
206
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
210
206

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?