Linuxの.bashrcに設定を書いても反映されなかった日の話|ログインシェルと.bash_profileの違いを理解するまで

HOME > リナックスマスター.JP 公式ブログ > Linux学習ガイド > Linuxの.bashrcに設定を書いても反映されなかった日の話|ログインシェルと.bash_profileの違いを理解するまで
宮崎智広 この記事の監修:宮崎智広(Linux実務・教育歴20年以上・受講者3,100名超)
「.bashrcにaliasを書いたのに、SSHでサーバーにログインすると設定が効いていない…」
Linuxを使い始めた人がよくつまずく、典型的な落とし穴です。

私のセミナーでも「~/.bashrcにいろいろ書いているのに、本番サーバーに入ると消えている」という質問は定番です。設定ファイルに書いたのに「なぜ反映されないのか」——その答えは、Bashシェルの「ログインシェル(login shell)」と「インタラクティブシェル(interactive shell)」という2つの動作モードの違いにあります。

この記事では、SE時代(2001年~2006年)から20年以上Linuxサーバーを運用してきた経験をもとに、.bashrcと.bash_profileの違いと正しい使い分けを解説します。仕組みを理解することで、「設定が消えた」「SSHで入ると別人の環境みたいだ」というトラブルは二度と起きなくなります。

この記事のポイント

・SSHログイン(ログインシェル)は.bash_profileを読み込み、.bashrcは読み込まない
・.bash_profileから.bashrcをsourceする1行が「設定が消える」問題の根本対策
・aliasや関数定義は.bashrcに、環境変数・PATHは.bash_profileに書くのが原則
・bashrcの編集前にバックアップを取る習慣で設定ファイル事故を防げる


Linuxの.bashrcに設定を書いても反映されなかった日の話|ログインシェルと.bash_profileの違いを理解するまで
「このままじゃマズい」と感じていませんか?
参考書を開く気力もない、同年代に取り残される不安——
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
姓・名・メールの3つだけ/30秒/解除は3秒 / 詳細はこちら

なぜ.bashrcへの設定がSSHログイン後に「効かない」のか

「llコマンドのエイリアスを~/.bashrcに設定したのに、サーバーにSSHで入ったら使えない。ローカルのターミナルでは動いているのに…」という状況の原因から説明します。

結論から言うと、SSHでサーバーにログインしたときに起動するのはログインシェルであり、ログインシェルは.bashrcではなく.bash_profileを読み込むという仕様が原因です。

LinuxのBashシェルには、大きく2種類の動作モードがあります。

・ログインシェル: SSHログインや su - コマンドで起動するシェル。/etc/profile → ~/.bash_profileの順で設定ファイルを読み込む
・非ログインインタラクティブシェル: ターミナルアプリを新しく開いたり、bashコマンドで起動するシェル。/etc/bashrc(またはディストリビューションによっては/etc/bash.bashrc)→ ~/.bashrcを読み込む

私がSE時代に担当していた案件に、踏み台サーバー経由で本番機に接続する環境がありました。ある日、新人エンジニアが「本番サーバーに入ると自分のaliasが全部消える」と困っていました。聞いてみると、~/.bashrcにたくさんのカスタマイズを書いていたのですが、~/.bash_profileが.bashrcを一切読み込んでいなかったのです。

解決策はシンプルです。.bash_profileから.bashrcを読み込む1行を追加するか、設定の書き先を正しいファイルに変えることで解決します。ただし、その前に2つのモードの違いをきちんと理解しておく必要があります。

ログインシェルとインタラクティブシェルの違い(コマンドで確認する)

「ログインシェル」と「インタラクティブシェル」は、Linuxの設定ファイルを正しく扱うための基礎知識です。頭で理解するだけでなく、実際に確認コマンドで体感することが大切です。

1. echo $0 でシェルの種類を見る

現在のシェルがログインシェルかどうかは、次の方法で確認できます。

# echo $0 でシェルの種類を確認する echo $0 # 出力例(ログインシェルの場合): -bash # 出力例(非ログインシェルの場合): bash # shopt login_shell でも確認できる shopt login_shell # 出力例(ログインシェルの場合): login_shell on # 出力例(非ログインシェルの場合): login_shell off

ログインシェルのとき、$0の出力は「-bash」のように先頭にハイフン(-)が付きます。非ログインシェルのときは「bash」とだけ表示されます。このハイフンの有無がログインシェルかどうかを示す目印です。

20年以上サーバーを運用してきた経験から言うと、この確認コマンドを知っているだけで「設定が消えた気がする」という状況の原因の大半は特定できます。サーバーに入ったら環境を疑う前にまず `echo $0` を叩く習慣をつけておくと、原因究明が格段に速くなります。

2. どの場面でどちらのシェルが起動するか

・ログインシェルが起動する場面: ssh user@hostname でのSSHログイン、su - username(ハイフンあり)でのユーザー切り替え、仮想コンソール(Ctrl+Alt+F2等)へのログイン、bash --login での明示的な起動
・非ログインインタラクティブシェルが起動する場面: ターミナルソフト(GNOME Terminal、macOSのTerminal.app等)を新しく開く、bashコマンドで新しいシェルを起動、su username(ハイフンなし)でのユーザー切り替え

特に注意が必要なのが「su」の挙動です。su - user(ハイフンあり)はログインシェルを起動して~/.bash_profileを読み込みますが、su user(ハイフンなし)は非ログインシェルを起動するため~/.bashrcを読み込みます。この違いを知らないと、「suでユーザーを切り替えたのに環境変数が引き継がれない」「PATH設定が変わる」という混乱が起きます。現場のエンジニアでも混同している人は少なくありません。

3. 読み込まれる設定ファイルの一覧

整理すると次のとおりです。

・ログインシェル: /etc/profile → ~/.bash_profile(なければ~/.bash_login → ~/.profileの順に探す)
・非ログインインタラクティブシェル: /etc/bashrc(ディストリビューションによっては/etc/bash.bashrc)→ ~/.bashrc
・スクリプト実行(bash script.sh): 設定ファイルを読み込まない(非インタラクティブシェル)

「スクリプト実行のとき設定ファイルを読まない」という点は実務でよくハマります。シェルスクリプトの中でaliasを使おうとして「command not found」になる原因の多くがこれです。スクリプト内では明示的に設定ファイルをsourceするか、aliasに頼らずコマンドのフルパスを書くようにしてください。

.bashrcと.bash_profileの役割と正しい書き方

2つのシェルモードと読み込まれる設定ファイルの違いが分かったところで、「何をどちらのファイルに書くか」という使い分けを整理します。

1. .bash_profileに書くべきもの

ログインシェルでのみ読み込まれる.bash_profileには、「ログインセッション全体で有効にしたい設定」を書くのが原則です。

・環境変数(export): JAVA_HOME、GOPATH、AWS_DEFAULT_REGION など、実行環境に影響する変数
・PATHの追加: /usr/local/bin へのパス追加、自作スクリプトのディレクトリのパスなど
・.bashrcの読み込み: 後述する標準パターンで、.bashrcの設定をログインシェルでも有効にするために記述する

2. .bashrcに書くべきもの

インタラクティブシェルが起動するたびに読み込まれる.bashrcには、「シェルを操作するときに必要な設定」を書きます。

・alias(エイリアス): ll='ls -la'、grep='grep --color=auto' など、短縮コマンドの定義
・関数定義: よく使うコマンドの組み合わせをシェル関数として定義するもの
・プロンプト設定(PS1): コマンドプロンプトの表示色やフォーマットのカスタマイズ
・シェルオプション: shopt -s histappend(コマンド履歴をファイルに追記)、shopt -s cdspell(cdのタイポ訂正)など

3. .bash_profileから.bashrcを読み込む標準パターン

CentOS/RHEL系のデフォルト.bash_profileには、すでに以下のような記述が含まれていることが多いです。この記述がなければ追記してください。

# ~/.bash_profile の末尾に追記する内容 # cat ~/.bash_profile で現在の記述内容を確認してから追記すること # .bashrcファイルが存在する場合のみ読み込む if [ -f ~/.bashrc ]; then . ~/.bashrc fi

この数行を.bash_profileに追加するだけで、SSHでログインした際(ログインシェル)でも.bashrcの設定が有効になります。セミナーで3,100名以上を指導してきた中で、この1パターンを覚えることで「設定が消えた」問題のほぼ全てが解決する受講生を多く見てきました。

【重要】追記後は、ログアウトして再ログインするか `source ~/.bash_profile` を実行して反映を確認してください。ローカルでsourceしただけでは次回SSHログイン時の挙動は確認できません。必ず一度ログアウト→ログインのサイクルを踏んで確認するのが鉄則です。

「設定が反映されない」「設定が消えた」エラー・トラブル別の対処法

.bashrcと.bash_profileの仕組みを理解した上で、よくあるトラブルと対処法を整理します。私が現場でよく見かけるのが、以下の4パターンです。

1. SSHログイン後にaliasが効かない

原因: .bash_profileが.bashrcをsourceしていない

対処法: .bash_profileに `[ -f ~/.bashrc ] && . ~/.bashrc` を追記する。追記後はログアウト→再ログインして動作確認する

確認コマンド: `grep -n bashrc ~/.bash_profile` を実行し、.bashrcを読み込む行があるか確認する。何も出力されなければ追記が必要

2. source後は有効だが再ログインすると設定が消える

原因: ターミナルで `source ~/.bashrc` を打って設定が反映されても、それはカレントシェルにのみ適用されている。次回のSSHログイン(ログインシェルの起動)では.bashrcが直接は読み込まれないため、設定が消えたように見える

対処法: 上記と同じく、.bash_profileから.bashrcをsourceするように修正する

3. PATH設定が毎回重複して長くなる

原因: ターミナルを開くたびに.bashrcが再読み込みされ、PATHに同じパスが何度も追加されていく。`echo $PATH` で確認すると同じパスが延々と連結している状態になる

対処法: PATHへの追加時に、すでに含まれているかどうかをチェックする記述にする

# ~/.bashrc に書くPATH追加の例(重複防止付き) # case で既存PATHに含まれているかチェックしてから追加する case "$PATH" in */usr/local/myapp/bin*) ;; *) export PATH="/usr/local/myapp/bin:$PATH" ;; esac # シンプルなif文でも可 # echo $PATH | grep -q '/usr/local/myapp/bin' || export PATH="/usr/local/myapp/bin:$PATH"

4. .bashrcの編集後に bash: syntax error が出る

原因: .bashrcの書き方にシンタックスエラーがある(クォートの閉じ忘れ、全角スペースの混入など)。最悪の場合、ログイン直後にエラーが出てシェルが使えなくなる

対処法: `bash -n ~/.bashrc` でシンタックスチェックをする。エラーがあればファイル名と行番号が表示される。何も表示されなければ文法は正しい

また、.bashrcの編集前には必ずバックアップを取る習慣をつけることをお勧めします。`cp ~/.bashrc ~/.bashrc.bak.$(date +%Y%m%d)` で日付付きのバックアップが作れます。編集→`bash -n`でチェック→`source ~/.bashrc`で確認、という3ステップを毎回やる習慣をつけてください。

実務で踏みがちな.bashrc設定の落とし穴3つ

技術的な理解が深まったところで、実務でよくある「踏んで初めて気づく」落とし穴を3つ紹介します。セミナーで3,100名以上を指導してきた中で、繰り返し目にしてきたパターンです。

落とし穴1: .bashrcに重い処理を書く

「ターミナルを開くたびに自動でスクリプトが実行されるなら、サーバー状態確認のコマンドもここに書こう」という発想から、wgetやcurlでHTTPリクエストを投げたり、大量ファイルを検索するスクリプトを書いてしまうケースがあります。

.bashrcは新しいインタラクティブシェルが起動するたびに毎回実行されます。そのため、処理が重ければターミナルを開くたびに数秒~数十秒待たされる事態になります。本番サーバーで `bash` と打って新しいシェルを起動した際に、しばらく固まってしまうのは典型的な症状です。.bashrcに書くのは、即座に実行が終わる軽い設定(alias定義、変数設定、プロンプト設定など)だけにしてください。

落とし穴2: .bash_profileと.bashrcで循環参照を作る

.bash_profileが.bashrcをsourceして、.bashrcがさらに.bash_profileをsourceするような書き方をすると、シェル起動時に循環参照が発生して無限ループになることがあります。

多くのシェルは無限ループの前に終了してくれますが、「.bash_profileが動かない」「毎回謎のエラーが出る」という原因不明の症状になることがあります。source先のファイルに相互参照(A→B→A→…)がないか、追記前に必ず確認する習慣をつけてください。

落とし穴3: 個人のalias設定に依存しすぎる

自分のPC上では動くaliasが、会社の他のサーバーや転職先のサーバーに入ると一切使えません。aliasはそのホストの~/.bashrcに設定されているものにしか存在しないからです。

本番サーバーに個人のalias設定を大量に書き込むのも要注意です。チームで共有しているサーバーに `ll='ls -la'` を書いておいたとして、他のメンバーがそのalias定義を知らずに `ll` を使い始めると、誰かがalias定義を削除した日に予期しない「command not found」が起きます。

本番サーバーでは必要最低限の設定にとどめ、aliasに頼りすぎずコマンドの正式な書き方を日頃から意識しておくことが重要です。Linuxサービスの管理や運用と合わせてシェル環境を整備していくと効率的です。systemctlとchkconfigの使い方・サービスの起動・停止・自動起動設定も参考にしてみてください。

また、.bash_profileに環境変数を設定する際、ネットワーク環境やDNS設定が絡む場面ではLinuxのDNS設定:resolv.confとnmcliの使い方も合わせて読んでおくとサーバー運用の全体像が把握しやすくなります。

まとめ

.bashrcと.bash_profileの違いは、Linuxのシェル環境を正しく制御するための基礎知識です。「設定を書いたのに反映されない」という問題のほとんどは、2つのファイルの読み込みタイミングの違いを理解することで解決します。

実務での基本方針として、aliasや関数定義は ~/.bashrc に書き、~/.bash_profileから ~/.bashrcをsourceする1行を必ず入れておくことをお勧めします。これだけで、SSHログイン時も普段のターミナル操作でも同じ設定が使えるようになります。
状況 起動するシェル 読み込まれるファイル
ssh user@host でログイン ログインシェル ~/.bash_profile
su - user でユーザー切り替え ログインシェル ~/.bash_profile
ターミナルを新しく開く 非ログインインタラクティブ ~/.bashrc
su user(ハイフンなし) 非ログインインタラクティブ ~/.bashrc
bash script.sh でスクリプト実行 非インタラクティブ 読み込まない

現場で通用する安全なLinuxサーバー構築の「型」を体系的に身につけたい方へ、

リナックスマスターでは、.bashrcの設定から本番サーバーの構築・セキュリティ設定まで、現場で即戦力になるスキルを体系的に学べる少人数ハンズオンセミナーを開催しています。20年以上の現場経験をもつ講師が直接指導する2日間で、座学だけでは身につかない「手が動く力」を習得できます。

>> Linux Master Pro Seminarの詳細を見る

無料メルマガで学習を続ける

Linuxの実践スキルをメールで毎週お届け。
登録は30秒、解除もいつでも可。

登録無料・いつでも解除できます

暗記不要・1時間後にはサーバーが動く

3,100名以上が実践した「型」を無料で公開中

プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。

姓・名・メールの3つだけ/30秒/解除は3秒 / 詳細はこちら

Linux無料マニュアル(図解60P) 名前とメールで30秒登録
宮崎 智広

この記事を書いた人

宮崎 智広(みやざき ともひろ)

株式会社イーネットマーキュリー代表。現役のLinuxサーバー管理者として20年以上の実務経験を持ち、これまでに累計3,100名以上のエンジニアを指導してきたLinux教育のプロフェッショナル。「現場で本当に使える技術」を体系的に伝えることをモットーに、実践型のLinuxセミナーの開催や無料マニュアルの配布を通じてLinux人材の育成に取り組んでいる。

趣味は、キャンプにカメラ、トラウト釣り。好きな食べ物は、ラーメンにお酒。休肝日が作れない、酒量を減らせないのが悩み。最近、ドラマ「フライトエンジェル」を観て涙腺が崩壊しました。