.bashrc と .profile の読み込み順 - 設定が反映されない問題

.bashrc と .profile の読み込み順 - 設定が反映されない問題

ライニー先輩、設定が全然反映されない!

リナ: ライニー先輩!.bashrc にエイリアスを追加したのに、ターミナルを開き直しても使えないんです…
ライニー先輩: あ、それよくある悩みだね!.bashrc.profile、どっちがいつ読み込まれるかを理解すると解決するよ。

この記事では次の疑問に答えます。

  • .bashrc.profile は何が違うの?
  • 設定を書いたのに反映されないのはなぜ?
  • SSH 接続でエイリアスが使えないのはなぜ?
  • 再起動せずに設定を反映する方法は?

.bashrc.profile の役割の違い

リナ: .bashrc.profile、似たようなファイルがあってどっちに書けばいいか全然わかりません。
ライニー先輩: まず「それぞれいつ読み込まれるか」を理解するのが先決だよ。
ファイル 読み込まれるタイミング
~/.bashrc インタラクティブシェル(通常のターミナルを開いたとき)
~/.profile ログインシェル(SSH 接続時・ログイン時)
~/.bash_profile ログインシェル.profile より優先される)

~/.bash_profile が存在する場合、~/.profile は読み込まれません。どちらか一方だけが使われます。

シェルの2種類を理解しよう

リナ: 「ログインシェル」と「インタラクティブシェル」って何が違うんですか?
ライニー先輩: 「どうやって Bash が起動したか」によって種類が変わるんだよ。デスクトップのターミナルと SSH 接続では違う種類のシェルが起動するんだ。

ログインシェル

次の状況で起動する:

  • SSH でサーバに接続したとき(ssh user@host
  • sudo -i でルートシェルに切り替えたとき
  • su - でユーザーを切り替えたとき

読み込まれるファイル:

  1. /etc/profile
  2. ~/.bash_profile(存在する場合)または ~/.profile

インタラクティブ非ログインシェル

次の状況で起動する:

  • GNOME Terminal などのターミナルアプリを開いたとき
  • bash コマンドで新しいシェルを起動したとき

読み込まれるファイル:

  1. /etc/bash.bashrc
  2. ~/.bashrc

覚え方: デスクトップのターミナル → ~/.bashrc、SSH 接続 → ~/.profile(または ~/.bash_profile

読み込み順の全体図

リナ: SSH で接続したときに .bashrc のエイリアスが使えないのは、ログインシェルが .bashrc を読まないからですか?
ライニー先輩: そのとおり!SSH はログインシェルを使うので、~/.bashrc は自動では読み込まれないんだよ。
ログインシェル(SSH 接続時):
  /etc/profile
    └─ ~/.bash_profile(存在する場合)
         └─ ~/.bashrc(bash_profile の中から呼び出す記述がある場合のみ)
       または
    └─ ~/.profile(bash_profile がない場合)
         └─ ~/.bashrc(profile の中から呼び出す記述がある場合のみ)

インタラクティブシェル(ターミナル起動時):
  /etc/bash.bashrc
    └─ ~/.bashrc

ログインシェルは ~/.bashrc自動では読み込まない
SSH でもエイリアスや関数を使いたい場合は、~/.bash_profile または ~/.profile の中から ~/.bashrc を明示的に呼び出す必要がある。

よくある失敗パターンと解決策

パターン1:SSH 接続後にエイリアスが使えない

リナ: エイリアスを .bashrc に書いたのに、SSH で接続すると「command not found」になります!
ライニー先輩: それはログインシェルが .bashrc を読まないから。.bash_profile に「.bashrc を読み込む」処理を追加しよう。

解決策~/.bash_profile(なければ ~/.profile)に以下を追記する。

# ~/.bash_profile
if [ -f ~/.bashrc ]; then
    . ~/.bashrc
fi

Ubuntu では ~/.profile にこの記述が最初から入っていることが多い。まず確認しよう。

cat ~/.profile
# if running bash
if [ -n "$BASH_VERSION" ]; then
    # include .bashrc if it exists
    if [ -f "$HOME/.bashrc" ]; then
        . "$HOME/.bashrc"
    fi
fi

この記述があれば、SSH ログイン時にも ~/.bashrc が自動で読み込まれる。

パターン2:.bashrc を編集したのにターミナルに反映されない

リナ: .bashrc を編集したのに、ターミナルを開き直しても新しいエイリアスが使えません…
ライニー先輩: ターミナルを「新しく開く」のは正しいんだけど、すでに開いているターミナルには反映されないよ。そこで使うのが source コマンドだ!

source コマンドで即時反映できる:

source ~/.bashrc

または同じ意味の短縮形:

. ~/.bashrc

source(またはドット .)は「現在のシェルの中でファイルを実行」する。ターミナルを再起動しなくても、設定の変更がすぐに反映される。

今のシェルの種類を確認する

リナ: 自分が今ログインシェルで起動しているかどうか、どうやって確認するんですか?
ライニー先輩: $0 変数を確認すると分かるよ!
echo $0
# ログインシェルなら先頭に - (ハイフン) がつく
-bash

# 非ログインシェルなら - がつかない
bash

また、どのファイルが読み込まれているかをデバッグするには:

# bash の起動ファイル読み込みを追跡する
bash --login -x 2>&1 | head -30

読み込まれているファイル名が + マーク付きで表示される。

何をどこに書くか:判断の基準

リナ: 結局、何はどこに書けばいいんでしょうか?
ライニー先輩: 用途で分けると整理しやすいよ。
設定の種類 書く場所 理由
エイリアス(alias ll='ls -la' など) ~/.bashrc インタラクティブシェルでのみ使う
シェル関数 ~/.bashrc 同上
環境変数(PATH など) ~/.profile ログインシェルでも必要
プロンプト設定(PS1 ~/.bashrc 表示設定はターミナル向け

PATH などの環境変数を ~/.bashrc に書いても日常的には動くが、cron などログインシェルなしで実行される環境では反映されないことがある。重要な環境変数は ~/.profile に書くのが安全。

実際に手を動かして確認しよう

リナ: 理論は分かってきたんですが、実際に試してみたいです!
ライニー先輩: じゃあ、ステップごとに確認していこう。

ステップ1:今のシェルの種類を確認

echo $0

ステップ2:~/.profile.bashrc の読み込みが含まれているか確認

grep -n "bashrc" ~/.profile
# 下記のような出力があれば OK
6:    if [ -f "$HOME/.bashrc" ]; then
7:        . "$HOME/.bashrc"
8:    fi

ステップ3:テスト用エイリアスを追加して即時反映を体験

# エイリアスを追加
echo "alias hello='echo Hello Linux World!'" >> ~/.bashrc

# source で即時反映
source ~/.bashrc

# 動作確認
hello
Hello Linux World!
反映されない場合のヒント

ファイルの末尾を確認して、エイリアスが正しく追記されているか見てみよう。

tail -5 ~/.bashrc

追記されていても動かない場合は、.bashrc の中でエラーが起きている可能性がある。

bash -n ~/.bashrc

エラーが出なければシンタックスは問題ない。

まとめ

覚えておくべきポイント

  • ~/.bashrc → ターミナルを開いたとき(インタラクティブシェル)に読み込まれる
  • ~/.profile → SSH 接続・ログイン時(ログインシェル)に読み込まれる
  • ~/.bash_profile が存在すると ~/.profile より優先される
  • ログインシェルでも .bashrc を使いたいなら ~/.profile から呼び出す
  • 設定を即反映するには source ~/.bashrc(またはターミナルを新しく開く)

次に読む