.bashrc が反映されない - 再読み込み(source)と .profile の読み込み順

.bashrc が反映されない - 再読み込み(source)と .profile の読み込み順

この記事でできるようになること

  • `~/.bashrc` と `~/.profile` が、それぞれいつ読まれるかを説明できる
  • SSH でエイリアスが使えない原因を見つけて直せる
  • `source ~/.bashrc` で、開いたままのターミナルに設定を反映できる

前提知識(先に読むと理解しやすい記事)

この記事でわかること

ライニー先輩、設定が反映されません

結論: .bashrc と .profile は読み込まれるタイミングが違う。SSH でエイリアスが使えない原因はここにある。

リナ: ライニー先輩、.bashrc にエイリアスを追加しました。でもターミナル入力したコマンドを解釈してコンピュータに実行させる対話プログラム。を開き直しても使えません。
ライニー先輩: それはよくある悩みだね。.bashrc.profile の 2 つが、どちらがいつ読み込まれるか。それを理解すれば解決するよ。

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

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

言葉の整理

  • シェル:あなたが打ったコマンドを読み取って実行するプログラムです。この記事では bash を前提にします。
  • 設定ファイル:シェルが起動時に自動で読む、命令を並べたファイルです。.bashrc.profile がこれにあたります。
  • エイリアス:長いコマンドに付けた短い別名です。「別名」「ショートカット」と呼ばれることもあります。

なお、名前が . で始まるファイルは「隠しファイル」と呼ばれます。ls では表示されません。ls -a を付けたときだけ表示されます。

先に、壊れたときの戻し方

この記事では設定ファイルを編集します。書き方を間違えると、ターミナルを開くたびにエラーが出ることがあります。

そこで、編集の前にコピーを取ってください。

$ cp ~/.bashrc ~/.bashrc.bak
$ cp ~/.profile ~/.profile.bak

~/.bash_profile が存在する環境では、そのファイルのコピーも取ってください。

おかしくなったら、コピーから戻せます。

$ cp ~/.bashrc.bak ~/.bashrc
$ source ~/.bashrc

エラーが出るだけでターミナルが使える場合は、上の 2 行で元に戻ります。

ターミナルが開いてすぐ閉じてしまう場合は、設定ファイルを読まずに起動できます。別のターミナルから次のように打ってください。

$ bash --norc --noprofile

この状態なら、上の cp で元に戻せます。

.bashrc.profile の役割の違い

結論: ~/.bashrc はターミナルを開いたときに読まれる。~/.profile は SSH 接続などのログイン時に読まれる。

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

~ は自分のホームディレクトリを表す記号です。~/.bashrc は「ホームディレクトリの中の .bashrc」という意味になります。

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

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

結論: ログインシェルは SSH 接続時に起動する。そして /etc/profile~/.bash_profile を読む。

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

2 種類の呼び名を先に整理します

  • ログインシェル:ユーザー名とパスワードで入ったときに始まるシェルです。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 が自動で読まれない。そのため ~/.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 を自分で呼び出してください。

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

結論: SSH でエイリアスが使えないときは ~/.bash_profile から ~/.bashrc を呼び出す。編集したら source ~/.bashrc で今すぐ反映する。

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

リナ: エイリアスを .bashrc に書きました。それなのに SSH で接続すると「command not found」になります。
リナ: 書き方を間違えたのでしょうか。ファイルは何度も見直しました。
ライニー先輩: 書き方は合っているよ。原因はログインシェルが .bashrc を読まないことなんだ。
リナ: えっ、ファイル自体が読まれていなかったんですか。それは思いつきませんでした。
ライニー先輩: そう。だから .bash_profile に「.bashrc を読み込む」処理を足そう。1 回書けば、次からは自動で読まれるよ。
リナ: 場所の問題だったんですね。納得しました。

解決策:まず ~/.bash_profile があるかを確認します。

$ ls -a ~ | grep bash_profile
  • 何も出ない場合(Ubuntu の初期状態):~/.profile に書き足してください。~/.bash_profile を新しく作らないでください。 作ると ~/.profile が読まれなくなります。その結果、Ubuntu が既定で設定している PATH が失われます。
  • ~/.bash_profile が出た場合:そちらに書き足してください。

書き足す内容は次の 3 行です。

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

この 3 行は「~/.bashrc というファイルがあれば、それを読み込む」という意味です。if は条件つきで実行するための書き方です。-f は「ファイルが存在するか」を確かめます。

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(またはドット .)は、指定したファイルを今のシェルの中で実行します。

ターミナルを開き直さなくても、設定の変更がすぐに反映されます。

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

結論: echo $0 でシェルの種類がわかる。先頭にハイフンが付いていれば、ログインシェルで起動している。

リナ: 自分が今ログインシェルで動いているかどうか、どうすれば確認できますか。
ライニー先輩: $0 という変数を見ればわかるよ。$0 には、今動いているシェルの名前が入っているんだ。
echo $0
# ログインシェルなら先頭に - (ハイフン) がつく
-bash

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

どのファイルが読み込まれているかを調べたいときは、次のコマンドを使います。

$ bash --login -x -c 'exit' 2>&1 | head -30

-c 'exit' は「起動したらすぐ終わる」という指示です。これを付けないと、入力待ちのまま止まって見えます。

実行された処理が + 付きで表示されます。そのうち . /etc/profile. /home/user/.bashrc のように .(ドット)で始まる行が、読み込まれた設定ファイルです。

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

結論: エイリアスや関数は ~/.bashrc に書く。PATH などの環境変数は ~/.profile に書く。これが基本ルール。

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

PATH などの環境変数を ~/.bashrc に書いても、日常の作業では動きます。

ただし cron のように、ログインシェルを経由せずに実行される場面があります。そこでは反映されないことがあります。大事な環境変数は ~/.profile に書くほうが安全です。

ミニ課題:実際に手を動かして確認しよう

結論: シェルの種類・読み込みの有無・即時反映の 3 問で、この記事の内容を手で確かめる。

リナ: 理屈はわかってきました。実際に試してみたいです。
ライニー先輩: いいね、3 問用意したよ。ターミナルで試してみて。

課題 1: 今使っているシェルが、ログインシェルかどうかを確かめよう。

ヒント 1(方向づけ)を見る

今動いているシェルの名前が入っている変数があります。その中身を画面に出します。

ヒント 2(コマンド名)を見る

使うのは echo です。変数は $0 です。

答えを見る
$ echo $0
bash

先頭に - が付いていなければ、ログインシェルではありません。デスクトップのターミナルでは、こちらが普通です。SSH で接続すると -bash と表示されます。

課題 2: ~/.profile の中に .bashrc を読み込む記述があるか確かめよう。

ヒント 1(方向づけ)を見る

ファイルの中から、特定の文字を含む行だけを探し出すコマンドがあります。行番号も一緒に出しましょう。

ヒント 2(コマンド名)を見る

使うのは grep です。行番号を出すオプションは -n です。探す文字は bashrc です。

答えを見る
$ grep -n "bashrc" ~/.profile
6:    if [ -f "$HOME/.bashrc" ]; then
7:        . "$HOME/.bashrc"
8:    fi

このような行が出れば、SSH でログインしたときも .bashrc が読み込まれます。何も出なければ、パターン1 の 3 行を書き足してください。

課題 3: テスト用のエイリアスを追加し、ターミナルを開き直さずに使えるようにしよう。

ヒント 1(方向づけ)を見る

設定ファイルの末尾に 1 行足します。そのあと、そのファイルを今のシェルで読み直します。

ヒント 2(コマンド名)を見る

書き足すのは echo>> です。読み直すのは source です。ファイルは ~/.bashrc です。

答えを見る
$ echo "alias hello='echo Hello Linux World!'" >> ~/.bashrc
$ source ~/.bashrc
$ hello
Hello Linux World!

>> はファイルの末尾に 1 行を書き足します。> と書くと中身を全部消してしまうので、ここでは使いません。

試したエイリアスを消したいときは、~/.bashrc の最終行を削除してから source ~/.bashrc を実行します。

反映されない場合のヒント

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

tail -5 ~/.bashrc

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

bash -n ~/.bashrc

このコマンドは、実行せずに書き方だけを調べます。何も出なければ書き方に問題はありません。

振り返り

リナ: つまり、設定が効かないときは「書き方」より先に「読まれているか」を疑うんですね。
ライニー先輩: そのとおり。.bashrc はターミナルを開いたとき、.profile はログインしたとき。この 2 つを分けて考えるといい。
リナ: 開いたままのターミナルに反映したいときは source ですね。覚えました。
ライニー先輩: 完璧だね。迷ったら echo $0 で、今どちらのシェルにいるかを確かめよう。

まとめ

覚えておくべきポイント

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

今日の 3 行まとめ

  1. ~/.bashrc はターミナルを開いたとき、~/.profile はログインしたときに読まれる
  2. SSH でエイリアスが使えないときは、~/.profile から ~/.bashrc を呼び出す
  3. 開いたままのターミナルに反映したいときは source ~/.bashrc を実行する

次に読む

この記事を共有

次の一手