じぶん対策

日々学んだことをアウトプットして備忘録にしています。

bash,zshにおける設定ファイルの読み込み順序について

bashzsh

Macユーザーの場合はどちらかを使用している人が多いのではと思います。
MacOS X Catalina以前はbash、以降はzshが標準のシェルです。

以下のサイトによると、

https://kanasys.com/tech/803

MacOS Xは当初tcshであったのがv10.3 Pantherよりbashに変更された

らしいです。

bashは"バッシュ"らしいですが、zshは"ズィーシェル"らしいです。(ゼッシュじゃないんだ、、、)

今回のテーマは設定ファイル

例えば環境構築の際に設定ファイルにパスを通したりします。
その時にの設定ファイルに設定を書いていて、どのように適用されているのか。
なんかzprofileとかzshrcとかいろいろあるけど違いがわからない、、、。
そういった背景から、設定ファイルの仕組みについて理解しておくべきかなと思い調査します。
(前職が組み込み系でLinuxPCを触ってたのでbashrcに書けばいいんやなくらいの理解はありますが詳しいことは知らなかったので)

設定ファイルの違い

起動時に読み込まれるファイルがbashzshでは異なります。 (bashでパス通してもzshじゃ通ってないみたいなことが起きます)

zshrc?zprofile?

設定ファイルには種類があり、それぞれ読み込まれるタイミングが違います。 (僕は全部zshrcに書いておけばいいと思ってました。)

以下の要素でどのファイルが読み込まれるかが変わります。

  • ログインシェルかどうか
  • 対話モードか非対話モードか

ログインシェルとは

例えば、ターミナルウインドウ開いた時に自動的にzshが立ち上がった状態がログインシェルです。 コマンドラインbin/bashbin/zshを実行した場合は非ログインシェルとなります。

対話モードとは

読んで字の如くターミナルで入力できるかどうかです。 例えばシェルスクリプト実行中はターミナル入力できないので非対話モードです。

設定ファイルの読み込み順

設定ファイルごとにglobalとlocalの二種類が存在します。(この定義が公式のものかどうかは調査できてないですが、理解をしやすくなる上で役に立つので便宜上以下の定義をします。)

  • globalは全てのユーザーで有効にしたい設定を記述します。場所は/etc/xxxです。
  • localは特定ユーザーでのみ有効にしたい場合に記述します。場所は~/.xxxxです。(隠しファイルなのでls -aなどじゃないと表示されません)

ログインシェル-対話モードの場合

global→localの順番で読み込まれます。(globalを読み込んだ後にlocalの内容で上書き読み込みされます)
bashの場合はlocalのファイルを一つ読み込んだあとは以降の探索が行われません。
(例えば.bash_profileに設定を記述していて、.profileにも設定を記述していた場合、後者は無視されます。) zshの場合は全て探索されます。 以下表の上から順番に読み込まれます。

bash zsh
/etc/profile /etc/zshenv
~/.bash_profile ~/.zshenv
~/bash_login /etc/zprofile
~/.profile /~/.zprofile
/etc/zshrc
~/.zshrc
/etc/zlogin
~/.zlogin

ちなみに.bashrc.bash_profileの中で読み込まれます。

ログインシェルの終了時には以下の順で読み込まれます。

終了時のみlocal→globalの順で読み込まれる点に注意

bash zsh
~/bash_logout ~/.zlogout
/etc/zlogout

非ログインシェル-対話モード時

bash zsh
~/.bashrc /etc/zshenv
~/.zshenv
/etc/zshrc
~/.zshrc

非ログインシェル-非対話モード時

bash zsh
$BASH_ENV /etc/zshenv
~/.zshenv

まとめ

  • 基本的にはglobal→localの順に読み込まれるが、終了時のみlocal→globalの順。
  • zshのetc/zshenvは影響範囲が大きいことがわかる。
  • どのファイルに何を書くべきかを考える必要がある。
  • 参考サイトにも書いているが、bashzsh両方から読み込まれるファイルを作ってそこにPATHを通すといいかもしれない。
  • .zprofile.bash_profileにはログインシェルに必要な設定のみを記述し、その他設定は.zshrc.bashrcにどんどん書くのがいいかもしれない。

所感

とりあえず.zshrcに書いておけばいいのかと思ってたのですがちゃんと調べると順番とかあってややこしかったです。
エラーの解決策を探っている時にこういう基本的なことが気になったりして勉強するいい機会になっています。
さくさくタスク進んでいる時よりエラーとか出て試行錯誤している時の方が成長しているまである。
それぞれのシェルの違いについてはまた調べようと思います。
ターミナルのカスタマイズも早くやらなきゃと思いつつまだ手を出せていないのでそのうち記事にします。

参考

https://kanasys.com/tech/803
https://qiita.com/muran001/items/7b104d33f5ea3f75353f
https://bacchi.me/linux/bash-settings/
https://qiita.com/dark-space/items/cf25001f89c41341a9fd