bashとzsh
Macユーザーの場合はどちらかを使用している人が多いのではと思います。
MacOS X Catalina
以前はbash、以降はzshが標準のシェルです。
以下のサイトによると、
らしいです。
bashは"バッシュ"らしいですが、zshは"ズィーシェル"らしいです。(ゼッシュじゃないんだ、、、)
今回のテーマは設定ファイル
例えば環境構築の際に設定ファイルにパスを通したりします。
その時にの設定ファイルに設定を書いていて、どのように適用されているのか。
なんかzprofile
とかzshrc
とかいろいろあるけど違いがわからない、、、。
そういった背景から、設定ファイルの仕組みについて理解しておくべきかなと思い調査します。
(前職が組み込み系でLinuxPCを触ってたのでbashrcに書けばいいんやなくらいの理解はありますが詳しいことは知らなかったので)
設定ファイルの違い
起動時に読み込まれるファイルがbashとzshでは異なります。 (bashでパス通してもzshじゃ通ってないみたいなことが起きます)
zshrc?zprofile?
設定ファイルには種類があり、それぞれ読み込まれるタイミングが違います。
(僕は全部zshrc
に書いておけばいいと思ってました。)
以下の要素でどのファイルが読み込まれるかが変わります。
- ログインシェルかどうか
- 対話モードか非対話モードか
ログインシェルとは
例えば、ターミナルウインドウ開いた時に自動的にzshが立ち上がった状態がログインシェルです。
コマンドラインでbin/bash
やbin/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は影響範囲が大きいことがわかる。
- どのファイルに何を書くべきかを考える必要がある。
- 参考サイトにも書いているが、bashとzsh両方から読み込まれるファイルを作ってそこに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