bashを使っていると必ず出会う「
.bash_profile」と「.bashrc」。
「どっちに何を書けばいいの?」「設定が反映されない!」といった悩みを抱えたことはありませんか?
この記事では、これらの設定ファイルの違いと使い分けを、実務で使えるテンプレート付きで解説します。
基本の考え方:読み込まれるタイミング
bashには2つの重要な概念があります:
- ログインシェル/非ログインシェル
- インタラクティブ/非インタラクティブ
これらの組み合わせによって、読み込まれる設定ファイルが変わります。
| シェル種別 | 主な起動例 | 読み込まれる設定ファイル |
|---|---|---|
| インタラクティブ・ログインシェル | macOSのTerminal起動、SSHログイン |
/etc/profile → ~/.bash_profile → (なければ)~/.bash_login または ~/.profile
|
| インタラクティブ・非ログインシェル | 既存シェルから bash 実行 |
~/.bashrc |
| 非インタラクティブ・シェル | スクリプト実行 (bash script.sh) |
何も読まない(ただし BASH_ENV 指定時はそのファイル) |
実際の起動パターン
実際の環境では、以下のようなパターンになります:
-
macOSのTerminal → ログインシェル(
.bash_profileが読まれる) -
SSHログイン → ログインシェル(
.bash_profile) -
既存bashから
bash起動 → 非ログインシェル(.bashrc) -
tmux起動 → 設定によりログイン扱いになり
.bash_profileが再実行される可能性あり -
scp/SSHリモートコマンド → 非インタラクティブでも
.bashrcが読まれる場合がある
役割分担:何を書くべきか
.bash_profile(ログイン時に1回だけ実行)
環境変数など、1回だけ定義すべきものを記述します。
# ~/.bash_profile
export PATH="$HOME/bin:$PATH"
export EDITOR=vim
# .bashrcを呼ぶ(macOSやSSHで必要)
if [ -r ~/.bashrc ]; then
. ~/.bashrc
fi
重要なポイント:
- 環境変数 (
export) の設定 - PATH, EDITORなど、システム全体で使う設定
-
.bashrcを読み込む1行を必ず追加する(macOS対策)
.bashrc(対話シェルごとに毎回実行)
エイリアスや関数など、対話的な操作のための設定を記述します。
# ~/.bashrc
case $- in *i*) : ;; *) return ;; esac # 対話時のみ実行
[ -f /etc/bash_completion ] && . /etc/bash_completion
alias ll='ls -alF'
alias gs='git status'
mkcd () { mkdir -p "$1" && cd "$1"; }
重要なポイント:
- エイリアス、関数、補完などを定義
-
exportは不要な場合が多い(重複を避ける) - 非対話時の実行をガードする(
case $- in *i*) : ;; *) return ;; esac)
よくある混乱と対処法
| 症状 | 原因 | 対策 |
|---|---|---|
.bashrc の設定が反映されない |
.bash_profileから呼ばれていない |
.bash_profile に source ~/.bashrc を追加 |
| PATHが長くなりすぎる |
.bashrcで毎回exportしている |
exportは.bash_profile側へ移す |
| scp/sshでechoが出る |
.bashrcに出力処理がある |
[[ $- == *i* ]] でガードする |
実務向けテンプレート
基本テンプレート
~/.bash_profile
# 環境変数はここで一度だけ
export PATH="$HOME/bin:$PATH"
export EDITOR=vim
# 対話設定を読み込む
if [ -r ~/.bashrc ]; then
. ~/.bashrc
fi
~/.bashrc
case $- in *i*) : ;; *) return ;; esac
[ -f /etc/bash_completion ] && . /etc/bash_completion
alias ll='ls -alF'
alias gs='git status'
mkcd () { mkdir -p "$1" && cd "$1"; }
環境別の設定例
macOS
# ~/.bash_profile
export PATH="$HOME/bin:$PATH"
export EDITOR=vim
if [ -r ~/.bashrc ]; then
. ~/.bashrc
fi
# ~/.bashrc
case $- in *i*) : ;; *) return ;; esac
[ -f /etc/bash_completion ] && . /etc/bash_completion
alias ll='ls -alF'
alias gs='git status'
mkcd () { mkdir -p "$1" && cd "$1"; }
注意点: macOSはTerminalが「ログインシェル」として起動するため、.bash_profileが必ず読まれます。.bashrcをsourceするのを忘れないようにしましょう。
Cursor / VSCode(統合ターミナル)
# ~/.bash_profile
export PATH="$HOME/bin:$PATH"
export EDITOR=vim
[ -r ~/.bashrc ] && . ~/.bashrc
# ~/.bashrc
case $- in *i*) : ;; *) return ;; esac
[ -f /etc/bash_completion ] && . /etc/bash_completion
alias ll='ls -alF'
alias gs='git status'
注意点: CursorやVSCodeの統合ターミナルは多くの場合「非ログインbash」として起動するため、.bashrc が直接使われます。VSCodeの場合、設定ファイルでシェルを /bin/bash に指定し、必要に応じて login: true にすると .bash_profile も読まれます。
Linux
# ~/.bash_profile
export PATH="$HOME/.local/bin:$HOME/bin:$PATH"
export EDITOR=vim
[ -r ~/.bashrc ] && . ~/.bashrc
# ~/.bashrc
case $- in *i*) : ;; *) return ;; esac
[ -f /etc/bash_completion ] && . /etc/bash_completion
PS1='\u@\h:\w\$ '
alias ll='ls -alF'
alias la='ls -A'
mkcd () { mkdir -p "$1" && cd "$1"; }
注意点: Linuxの多くのディストリビューションでは、端末は非ログインシェルとして起動するため .bashrc が主役になります。
Windows
Git Bashの場合
# ~/.bash_profile
export PATH="$HOME/bin:$PATH"
export EDITOR=vim
[ -r ~/.bashrc ] && . ~/.bashrc
# ~/.bashrc
case $- in *i*) : ;; *) return ;; esac
if [ -f /usr/share/git/completion/bash_completion ]; then
. /usr/share/git/completion/bash_completion
fi
alias ll='ls -alF --color=auto'
alias gs='git status'
WSLの場合
Linuxと同じ運用でOKです。
# ~/.bash_profile
export PATH="$HOME/.local/bin:$HOME/bin:$PATH"
export EDITOR=vim
[ -r ~/.bashrc ] && . ~/.bashrc
# ~/.bashrc
case $- in *i*) : ;; *) return ;; esac
[ -f /etc/bash_completion ] && . /etc/bash_completion
alias ll='ls -alF'
alias gs='git status'
まとめ
-
.bash_profile→ 環境変数・起動時1回限りの設定 -
.bashrc→ 対話的設定(エイリアス・補完・関数など) - macOS/SSHでは
.bash_profileしか読まれないことがあるため.bashrcをsourceする - PATH多重追加・echo出力の副作用に注意
- tmuxやCursor、VSCodeなど、起動環境ごとにログインシェル扱いが異なるため確認必須
この構成にしておけば、macOS・Linux・Windows(Git Bash/WSL)・Cursor・VSCodeのどれでも安定して同じ挙動を得られます。