😎

zshで/etc/zshenvや/etc/zprofileが読まれない問題

2021/01/30に公開

まとめ

  • zshにおいて全ユーザグローバルな設定をしたい
    • bashにおける /etc/profile 的なの
  • /etc/zshenv/etc/zshprofileが該当するが何故か読み込まれない
  • /etc/zsh/zshenv/etc/zsh/zprofile が読まれている可能性がある
  • man zshFILES のところにどこから読まれるか書いてあるので要確認

背景

共有マシンにおいて全ユーザに共通の設定をしたい場合があります。
この時、bashでは /etc/profile.d 以下に .sh ファイルを置くことで対応できますが、zshだとそこは読まれません。

zshは起動時に以下のファイルを読み込むため、これらに該当する設定を書く、もしくは同じ設定ファイルを読み込むことで両方のシェルに設定できます。

       /etc/zshenv
       /etc/zprofile
       /etc/zshrc
       /etc/zlogin
       /etc/zlogout

ただし、手元の環境ではなぜかどれも読み込まれませんでした。

原因

man zshすると以下のように出ており、インストールした際に何らかの原因で /etc/zsh以下にあるファイルを読み込むように変更されていました。
そのため、/etc/zsh/zshenv 等に処理を書くことで無事読み込まれるようになります。

FILES
       /etc/zsh/zshenv
       /etc/zsh/zprofile
       /etc/zsh/zshrc
       /etc/zsh/zlogin
       /etc/zsh/zlogout    (installation-specific - /etc is the default)

その他

以下のようにzshの起動時のシステムコールからどのzshrcを読み込んでいるかを調べることで同様に発見することができます。
ただ、これはmanに書いてあることに気が付かなかったからであり、実際は man zsh で確認するのが最も早くて安心です。

% strace -e trace=file zsh -ic exit 2>&1  | grep zshrc
access("/home/ota42y/.zshrc", F_OK) = 0
stat("/etc/zsh/zshrc.zwc", 0x7fffb2525df0) = -1 ENOENT (No such file or directory)
stat("/etc/zsh/zshrc", {st_mode=S_IFREG|0644, st_size=3862, ...}) = 0
openat(AT_FDCWD, "/etc/zsh/zshrc", O_RDONLY|O_NOCTTY) = 3
stat("/home/ota42y/.zshrc.zwc", 0x7fffb2525df0) = -1 ENOENT (No such file or directory)
stat("/home/ota42y/.zshrc", {st_mode=S_IFREG|0664, st_size=31, ...}) = 0
openat(AT_FDCWD, "/home/ota42y/.zshrc", O_RDONLY|O_NOCTTY) = 3

# 以下から/etc/zsh/zshrcを読み込んでいることがわかる
# openat(AT_FDCWD, "/etc/zsh/zshrc", O_RDONLY|O_NOCTTY) = 3

Discussion