zshの設定ファイルについてまとめました

背景

Rubyのコードを追うたびに、タグジャンプを使いたいという気持ちが強まり、ついにコードジャンプの設定を行うことに決めました。そこで、VSCodeのプラグイン「ruby-solargraph」をインストールし、快適にRubyのコードを確認できるように準備を整えました。

しかし、実際に試してみると、Solargraphが動作せず、「Solargraphがインストールされていない」というエラーメッセージが表示されました。Globalにインストール済みのはずなのに、なぜ動かないのか原因が分からず、困惑しました。

原因を探るうちに、zshの設定ファイルに問題があるのではないかと考えました。これまでzshの設定の違いについて深く考えていなかったため、今回の問題を解決するためにzshの設定について調べ、まとめることにしました。


1. 設定ファイルの役割の違い

1.1 ~/.zshenv

  • 役割: すべてのzshシェルで最初に読み込まれる設定ファイルです。環境変数の設定など、すべてのシェルで共通して必要な設定を記述します。
  • 使用例: PATHの設定、LANGなどの環境変数の設定。
  • 注意: このファイルは、インタラクティブシェルかどうか、またはログインシェルかどうかに関係なく読み込まれます。そのため、インタラクティブシェル専用の設定や複雑な設定をここに入れると、予期せぬ動作を引き起こすことがあります。

1.2 ~/.zshrc

  • 役割: インタラクティブなzshシェルで読み込まれる設定ファイルです。ユーザーが直接操作するシェルの設定を行います。
  • 使用例: シェルのプロンプト設定、エイリアスの定義、プラグインの読み込み(例: oh-my-zshの設定)。
  • 注意: ログインシェルでも非ログインシェルでも、インタラクティブシェルとして起動されるときにのみ読み込まれます。非インタラクティブなシェル(スクリプト実行時など)では読み込まれません。

1.3 ~/.zprofile

  • 役割: ログインシェルで読み込まれる設定ファイルです。ユーザーのログイン時に一度だけ実行される設定を記述します。
  • 使用例: ログイン時に実行したいコマンドや、ログイン時にのみ適用したい環境変数の設定。
  • 注意: 通常、~/.zprofile~/.zloginはどちらか一方を使うことが推奨されます。~/.zprofile~/.bash_profile~/.profileに相当する役割を持ちます。

1.4 ~/.zlogin

  • 役割: ログインシェルで、~/.zshrcの後に読み込まれる設定ファイルです。ユーザーがログインした直後に実行される設定を記述します。
  • 使用例: ログインシェルに限り、追加の環境設定やログイン時に実行したいコマンドを設定します。
  • 注意: ~/.zprofileと競合しないように、どちらか一方を選んで使用するのが一般的です。

1.5 ~/.zlogout

  • 役割: ログインシェルが終了する際に読み込まれる設定ファイルです。ログアウト時に実行したいコマンドを記述します。
  • 使用例: ログアウト時にクリーンアップ作業を行うコマンドの実行など。
  • 注意: シェルを閉じる際のクリーンアップ作業や、セッション終了時の処理を行いたい場合に利用します。

2. シェルの読み込み順序

2.1 ログインかつインタラクティブなシェル

  • 定義: ユーザーがシステムにログインした後、コマンドを入力して対話的に操作するシェル。
  • :
    • SSHでリモートサーバーに接続して、コマンドを入力するシェル。
    • ログイン後に直接操作する最初のシェル。
  • 読み込みファイル:
    1. /etc/zshenv
    2. ~/.zshenv
    3. /etc/zprofile
    4. ~/.zprofile
    5. /etc/zshrc
    6. ~/.zshrc
    7. /etc/zlogin
    8. ~/.zlogin

2.2 ログインかつ非インタラクティブなシェル

  • 定義: ユーザーがシステムにログインした後、自動的に実行されるスクリプトやバッチ処理のシェル。ユーザーの直接のコマンド入力を受け付けません。
  • :
    • ログインシェルで起動されるスクリプトの実行。
  • 読み込みファイル:
    1. /etc/zshenv
    2. ~/.zshenv
    3. /etc/zprofile
    4. ~/.zprofile
    5. /etc/zlogin
    6. ~/.zlogin

2.3 非ログインかつインタラクティブなシェル

  • 定義: システムにログインするプロセスを経ずに起動され、ユーザーがコマンドを入力して対話的に操作するシェル。
  • :
    • ターミナルアプリを開いて操作するシェル(ログインシェルとして設定されていない場合)。
  • 読み込みファイル:
    1. /etc/zshenv
    2. ~/.zshenv
    3. /etc/zshrc
    4. ~/.zshrc

2.4 非ログインかつ非インタラクティブなシェル

  • 定義: システムにログインするプロセスを経ずに、ユーザーの直接入力を受け付けずに実行されるシェル。
  • :
    • スクリプトの実行やバッチ処理、システムサービスの開始時などに使用されるシェル。
  • 読み込みファイル:
    1. /etc/zshenv
    2. ~/.zshenv

まとめ

  • ~/.zshenv: すべてのシェルで共通に適用される設定。
  • ~/.zshrc: インタラクティブシェル(対話型シェル)用の設定。
  • ~/.zprofile: ログインシェル用の設定。ログイン時に一度だけ読み込まれる。
  • ~/.zlogin: ログインシェルで、~/.zshrcの後に実行される設定。
  • ~/.zlogout: ログインシェル終了時に実行される設定。