😎
zshで/etc/zshenvや/etc/zprofileが読まれない問題
まとめ
- zshにおいて全ユーザグローバルな設定をしたい
- bashにおける
/etc/profile
的なの
- bashにおける
-
/etc/zshenv
、/etc/zshprofile
が該当するが何故か読み込まれない -
/etc/zsh/zshenv
、/etc/zsh/zprofile
が読まれている可能性がある -
man zsh
のFILES
のところにどこから読まれるか書いてあるので要確認
背景
共有マシンにおいて全ユーザに共通の設定をしたい場合があります。
この時、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