.bashrc と .profile の読み込み順 - 設定が反映されない問題
ライニー先輩、設定が全然反映されない!
.bashrc にエイリアスを追加したのに、ターミナルを開き直しても使えないんです….bashrc と .profile、どっちがいつ読み込まれるかを理解すると解決するよ。この記事では次の疑問に答えます。
.bashrcと.profileは何が違うの?- 設定を書いたのに反映されないのはなぜ?
- SSH 接続でエイリアスが使えないのはなぜ?
- 再起動せずに設定を反映する方法は?
.bashrc と .profile の役割の違い
.bashrc と .profile、似たようなファイルがあってどっちに書けばいいか全然わかりません。| ファイル | 読み込まれるタイミング |
|---|---|
~/.bashrc |
インタラクティブシェル(通常のターミナルを開いたとき) |
~/.profile |
ログインシェル(SSH 接続時・ログイン時) |
~/.bash_profile |
ログインシェル(.profile より優先される) |
~/.bash_profile が存在する場合、~/.profile は読み込まれません。どちらか一方だけが使われます。
シェルの2種類を理解しよう
ログインシェル
次の状況で起動する:
- SSH でサーバに接続したとき(
ssh user@host) sudo -iでルートシェルに切り替えたときsu -でユーザーを切り替えたとき
読み込まれるファイル:
/etc/profile~/.bash_profile(存在する場合)または~/.profile
インタラクティブ非ログインシェル
次の状況で起動する:
- GNOME Terminal などのターミナルアプリを開いたとき
bashコマンドで新しいシェルを起動したとき
読み込まれるファイル:
/etc/bash.bashrc~/.bashrc
覚え方: デスクトップのターミナル → ~/.bashrc、SSH 接続 → ~/.profile(または ~/.bash_profile)
読み込み順の全体図
.bashrc のエイリアスが使えないのは、ログインシェルが .bashrc を読まないからですか?~/.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
fiUbuntu では ~/.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(またはターミナルを新しく開く)