bashの設定ファイルを正しく使えば、こうした手間は一切なくなります。
この記事では、bashの設定ファイル(
/etc/profile・~/.bash_profile・~/.bashrc・~/.bash_logout)の役割・違い・読み込み順序を体系的に解説します。ログインシェルと非ログインシェルの違い、
sourceコマンドの使い方まで、現場で必要な知識を網羅しています。【この記事でわかること】
・ログインシェルでは/etc/profile→~/.bash_profileの順に読み込まれる
・非ログインシェル(新しいターミナルを開く)では~/.bashrcだけが読まれる
・エイリアス・関数は~/.bashrcに書く。環境変数は~/.bash_profileに書く
・設定変更後はsource ~/.bashrcで即座に反映できる
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
bashの設定ファイルとは?全体像
bashの設定ファイルは、シェル起動時に自動で読み込まれる設定の定義ファイルです。環境変数・PATHの設定・エイリアス定義・関数定義などを記述しておくことで、シェル起動時に自動で適用されます。
主要な設定ファイルの一覧は以下のとおりです。
| ファイル | いつ読み込まれるか | 対象 |
|---|---|---|
| /etc/profile | ログインシェル起動時(最初に読み込まれる) | 全ユーザー共通 |
| ~/.bash_profile | ログインシェル起動時(/etc/profileの次) | ユーザー個別 |
| ~/.bash_login | ~/.bash_profileがない場合のログインシェル起動時 | ユーザー個別(代替) |
| ~/.profile | ~/.bash_profileも~/.bash_loginもない場合 | ユーザー個別(代替) |
| ~/.bashrc | 非ログインシェル(対話型シェル)起動時 | ユーザー個別 |
| /etc/bashrc | ~/.bashrcから呼び出される(直接は読まれない) | 全ユーザー共通(bash用) |
| ~/.bash_logout | ログインシェル終了時(ログアウト時) | ユーザー個別 |
ログインシェルと非ログインシェルの違い
bashの設定ファイルを理解する上で最も重要なのが、ログインシェルと非ログインシェルの違いです。どのファイルが読まれるかが全く異なります。
1. ログインシェルとは
ログインシェルは、SSHでサーバーにログインした時、コンソールにログインした時など、ユーザー認証を経てbashが起動するケースです。# ログインシェルかどうかを確認する $ echo $0 -bash ← 先頭の「-」がログインシェルの印 # または以下でも確認できる $ shopt login_shell login_shell on ← onならログインシェル
# ログインシェルの読み込み順序 1. /etc/profile (全ユーザー共通) 2. ~/.bash_profile (あれば) または ~/.bash_login (~/.bash_profileがなければ) または ~/.profile (上2つがなければ)
2. 非ログインシェルとは
非ログインシェルは、ターミナルエミュレータを新しく開く、bashコマンドを実行する、スクリプトを実行するなど、ログイン認証を経ずにbashが起動するケースです。# 非ログインシェルの確認 $ echo $0 bash ← 先頭に「-」がつかない # 非ログインシェルが起動すると読まれるファイル ~/.bashrc (これだけが読まれる)
sshで接続するとログインシェルが起動しますが、ssh user@host commandのようにコマンドを直接実行する場合は非ログインシェルになります。各設定ファイルの詳細と設定例
1. /etc/profile(全ユーザー共通・ログイン時)
/etc/profileは全ユーザーに適用されるため、システム管理者だけが編集します。基本的なPATHや環境変数の設定が記述されています。
# /etc/profileの一部(RHEL9/Rocky9の例) # 変数の設定 USER="`id -un`" # idコマンドの実行結果をUSERに設定 LOGNAME=$USER # LOGNAMEにUSERの値を設定 MAIL="/var/spool/mail/$USER" HISTSIZE=1000 HISTCONTROL=ignoredups # 変数をエクスポートして子プロセスに引き継ぐ export PATH USER LOGNAME MAIL HOSTNAME HISTSIZE HISTCONTROL # /etc/profile.d/ 以下の全スクリプトを読み込む for i in /etc/profile.d/*.sh; do if [ -r "$i" ]; then . "$i" fi done
/etc/profile.d/ディレクトリに個別の設定ファイルを置く仕組みが使われています。例えばJavaやRubyをインストールすると、そのPATH設定が
/etc/profile.d/java.shのような形で追加されます。2. ~/.bash_profile(ユーザー個別・ログイン時)
~/.bash_profileはログインシェルで読み込まれる、ユーザー固有の設定ファイルです。ここでは主に環境変数のエクスポートと
~/.bashrcの呼び出しを記述します。# ~/.bash_profileの典型的な内容 # 1. .bashrcを読み込む(ログインシェルでも.bashrcの設定を使うため) if [ -f ~/.bashrc ]; then . ~/.bashrc fi # 2. ユーザー固有のPATHを追加 PATH=$PATH:$HOME/bin PATH=$PATH:/opt/myapp/bin export PATH # 3. ログインシェル専用の環境変数 export JAVA_HOME=/usr/lib/jvm/java-17-openjdk export EDITOR=vim export LESS='-R'
~/.bash_profileから~/.bashrcを明示的に呼び出す記述がよくあります。これは「ログインシェルでもエイリアスや関数(~/.bashrcに書くもの)を使えるようにするため」です。
3. ~/.bashrc(ユーザー個別・非ログインシェル時)
~/.bashrcは対話型の非ログインシェル(新しいターミナルを開く等)で読み込まれます。エイリアスや関数の定義はここに書くのが一般的です。
# ~/.bashrcの典型的な内容 # 1. /etc/bashrcを読み込む(全ユーザー共通設定) if [ -f /etc/bashrc ]; then . /etc/bashrc fi # 2. エイリアスの定義 alias ll='ls -la --color=auto' alias grep='grep --color=auto' alias vi='vim' alias ..='cd ..' # 3. 便利な関数の定義 mkcd() { mkdir -p "$1" && cd "$1" } # 4. プロンプトのカスタマイズ PS1='[\u@\h \W]\$ ' # 5. ヒストリ設定 HISTSIZE=10000 HISTFILESIZE=20000 HISTCONTROL=ignoredups:erasedups
4. ~/.bash_logout(ログアウト時)
~/.bash_logoutは、ログインシェルが終了する(ログアウトする)時に実行されます。ターミナルのクリアや一時ファイルの削除に使われます。
# ~/.bash_logoutの例 # ログアウト時にターミナルをクリアする clear # または一時ファイルを削除する rm -f /tmp/my_session_*
sourceコマンドで設定を即座に反映する
設定ファイルを編集した後、ログアウト・再ログインなしに変更を反映させる方法がsourceコマンドです。1. sourceと「. (ドット)」コマンドの使い方
# ~/.bashrcを編集後、即座に反映させる $ source ~/.bashrc # または(ドットコマンド。sourceと同じ動作) $ . ~/.bashrc # ~/.bash_profileを反映させる $ source ~/.bash_profile # /etc/profileを反映させる(システム全体の設定変更時) $ source /etc/profile
sourceは現在のシェルに設定を読み込みます。bash ~/.bashrcのように実行すると、サブシェルで読み込まれるため、現在のシェルに変数やエイリアスが反映されません。設定反映には必ず
sourceを使ってください。よくあるトラブルと対処法
1. エイリアスが効かない(スクリプト内でエイリアスが使えない)
# 非対話型シェル(スクリプト)ではエイリアスは展開されない # 対処法: スクリプト冒頭でaliasを有効化する #!/bin/bash shopt -s expand_aliases source ~/.bashrc # または、エイリアスの代わりに関数を使う
2. SSHで接続してもPATHが反映されない
# 問題: ssh user@host "java -version" が動かない # 原因: ssh コマンド実行は非ログインシェルのため、 # ~/.bash_profileのJAVA_HOME設定が読まれない # 対処法1: ~/.bashrcにPATHを書く(非ログインシェルでも読まれる) export JAVA_HOME=/usr/lib/jvm/java-17-openjdk export PATH=$PATH:$JAVA_HOME/bin # 対処法2: ssh時に明示的にsourceする $ ssh user@server 'source ~/.bash_profile && java -version'
3. cronで設定した環境変数が効かない
# cronはbash設定ファイルを一切読まない # cronスクリプト内で直接環境変数を設定する必要がある #!/bin/bash export PATH=/usr/local/bin:/usr/bin:/bin export LANG=ja_JP.UTF-8 export JAVA_HOME=/usr/lib/jvm/java-17-openjdk export PATH=$PATH:$JAVA_HOME/bin # 以降の処理...
本記事のまとめ
| 設定ファイル | 読み込みタイミング | 主な用途 |
|---|---|---|
| /etc/profile | ログインシェル起動時(全ユーザー) | システム全体のPATH・環境変数 |
| ~/.bash_profile | ログインシェル起動時(ユーザー個別) | ユーザー固有の環境変数・~/.bashrcの呼び出し |
| ~/.bashrc | 非ログインシェル起動時(ユーザー個別) | エイリアス・関数・プロンプト設定 |
| ~/.bash_logout | ログインシェル終了時(ログアウト時) | ターミナルクリア・一時ファイル削除 |
| source / . | 手動実行(即時反映) | 設定ファイル編集後の即時適用 |
設定する内容によってどのファイルに書くべきかを整理すると、
「エイリアス・関数 → ~/.bashrc」「ログイン時のPATH・環境変数 → ~/.bash_profile」が基本です。
そして
~/.bash_profile内で~/.bashrcをsourceすることで、ログインシェルでもエイリアスが使える状態を維持するのが、現場での鉄則です。
bashの設定を使いこなしてLinuxを効率よく使いたい方へ
bashの設定ファイルを正しく使うことは、Linux上での作業効率を大きく左右します。
現場で通用する安全なLinuxサーバー構築の「型」を体系的に身につけたい方へ、「Linuxサーバー構築入門マニュアル(図解60P)」を完全無料でプレゼントしています。
「独学の時間がもったいない」「プロから直接、現場の技術を最短で学びたい」という本気の方には、2日で実務レベルのスキルが身につく【初心者向けハンズオンセミナー】も開催しています。
3,100名以上が実践した「型」を無料で公開中
プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。
登録10秒/合わなければ解除3秒 / 詳細はこちら
