speg03の雑記帳

主に未来の自分のために試したことなどを記録しています

MacのZshはシェル起動時にPATHをリセットする

zprofileに書いていたPATH設定だけが有効になっていなかったので調べたという話。zprofileに書いていたPATH以外の環境変数は有効になっていたのでzprofileが呼ばれていないわけではなかった。

path_helper

Macにはpath_helperというやつがあって、PATH環境変数を/etc/pathsや/etc/paths.dに書かれているパスで設定しなおす。で、こいつがまたいたるところで呼ばれる。

zshで呼ばれる設定ファイル

ログイン(ログインシェルとして起動)時にはzshenvとzprofile、対話シェルとして起動時にはzshenvが呼ばれる。PATHの設定は既存のPATHに追加していくので、ログイン時の一度だけ呼ばれて欲しい。そのためzprofileに書いていた。

件のzshenvは以下のようになっていた。

/etc/zshenv
# system-wide environment settings for zsh(1)
if [ -x /usr/libexec/path_helper ]; then
       eval `/usr/libexec/path_helper -s`
fi

zshenvでpath_helperが呼ばれているということは、対話シェルが起動する度にPATHがリセットされることになる。

対処

結局、/etc/zshenvの全行をコメントアウトすることにした。これでzprofileに書いていたPATH設定が有効になった。

追記 6/25 2:15

コメントいただきまして、brew info zshに情報がありました。これに沿ってやった方が良さそう。やはり/etc以下はあまり変えたくないので。

$ brew info zsh
To use this build of Zsh as your login shell, add it to /etc/shells.

If you have administrator privileges, you must fix an Apple miss
configuration in Mac OS X 10.7 Lion by renaming /etc/zshenv to
/etc/zprofile, or Zsh will have the wrong PATH when executed
non-interactively by scripts.

Alternatively, install Zsh with /etc disabled:

  brew install --disable-etcdir zsh

ということなので、

$ brew install --disable-etcdir zsh
$ sudo vi /etc/shells
(/usr/local/bin/zshを追加)
$ chsh
(Shellを/usr/local/bin/zshに変更)