.bashrc が反映されない - 再読み込み(source)と .profile の読み込み順
この記事でできるようになること
- `~/.bashrc` と `~/.profile` が、それぞれいつ読まれるかを説明できる
- SSH でエイリアスが使えない原因を見つけて直せる
- `source ~/.bashrc` で、開いたままのターミナルに設定を反映できる
前提知識(先に読むと理解しやすい記事)
この記事でわかること
.bashrcと.profileの違いがわかります。どちらがいつ読まれるかもわかります- ログインシェルユーザーがログインした直後に起動される最初のシェル。とインタラクティブシェルの違いがわかります
- SSH 接続でエイリアスが使えない原因と、その直し方がわかります
sourceコマンドで、設定を今すぐ反映できるようになります- 環境変数シェルやプログラムが参照する、名前と値の組み合わせで管理される設定値。・エイリアス・関数を、どのファイルに書けばよいか判断できます
ライニー先輩、設定が反映されません
結論: .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を読む。
2 種類の呼び名を先に整理します
- ログインシェル:ユーザー名とパスワードで入ったときに始まるシェルです。SSH 接続がその代表です。
- インタラクティブシェル:あなたがコマンドを打ち込むためのシェルです。「対話シェル」とも呼ばれます。
- ふだんデスクトップで開くターミナルは、「ログインではないインタラクティブシェル」にあたります。
ログインシェル
次の状況で起動します。
- SSH でサーバに接続したとき(
ssh user@host) sudo -iでルートシェルに切り替えたときsu -でユーザーを切り替えたとき
読み込まれるファイルは次の順番です。
/etc/profile~/.bash_profile(存在する場合)または~/.profile
インタラクティブ非ログインシェル
次の状況で起動します。
- GNOME Terminal などのターミナルアプリを開いたとき
bashコマンドで新しいシェルを起動したとき
読み込まれるファイルは次の順番です。
/etc/bash.bashrc~/.bashrc
覚え方: デスクトップのターミナル → ~/.bashrc、SSH 接続 → ~/.profile(または ~/.bash_profile)
読み込み順の全体図
結論: SSH ログイン時は
~/.bashrcが自動で読まれない。そのため~/.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 を自分で呼び出してください。
よくある失敗パターンと解決策
結論: 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 問で、この記事の内容を手で確かめる。
課題 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 行まとめ
~/.bashrcはターミナルを開いたとき、~/.profileはログインしたときに読まれる- SSH でエイリアスが使えないときは、
~/.profileから~/.bashrcを呼び出す - 開いたままのターミナルに反映したいときは
source ~/.bashrcを実行する