.bash_profileとは?場所・書き方・.bashrcとの違いを解説

環境&ワークフロー

結論:.bash_profileはどこにあり、何をするファイルか

先に結論だけまとめます。

  • 場所は ~/.bash_profile(自分のホームディレクトリ直下)。先頭がドットの隠しファイルなので ls -a でないと見えません。
  • Ubuntu / Debian では既定で存在しません。 代わりに ~/.profile が使われます。「探しても無い」のは正常です。
  • 読み込まれるのはログインシェルのときだけで、しかも1回だけです。
  • 編集後に反映するには source ~/.bash_profile を実行するか、ログインし直します。
# 自分の環境にあるか確認する
ls -la ~/.bash_profile ~/.bash_login ~/.profile 2>/dev/null

この記事では、.bash_profileの場所と読み込み順を実際のコマンド出力で確認したうえで、環境変数・PATH・エイリアスの設定、反映方法、そして初心者がほぼ必ずハマる「.bash_profileを作った途端にエイリアスが消える」問題までを解説します。

.bash_profileとは?

.bash_profileは、Bashがログインシェルとして起動したときに一度だけ読み込まれる設定ファイルです。ホームディレクトリに置き、環境変数の設定、PATHの追加、プロンプト(PS1)のカスタマイズなどを記述します。

「ログインシェル」とは、次のような場面で起動するシェルです。

  • SSHでサーバーにログインしたとき
  • コンソールでユーザー名とパスワードを入力してログインしたとき
  • su -bash -l のように、明示的にログインシェルとして起動したとき

逆に、デスクトップで端末アプリを新しく開いたり、bashとだけ打って子シェルを起動した場合は非ログインシェルになり、.bash_profileは読み込まれません。この違いが、後述する「設定が反映されない」トラブルの根本原因です。

.bash_profileの場所と、Ubuntuで見つからない理由

ファイルの場所を確認する

$ echo ~/.bash_profile
/home/mugi/.bash_profile

$ ls -a ~ | grep -E '^\.(bash|profile)'
.bash_history
.bash_logout
.bashrc
.profile

上の例では.bash_profileが出てきません。これはファイルが壊れているわけではなく、Ubuntu 24.04では新規ユーザーのホームに.bash_profileが配置されないためです。新規ユーザー作成時にコピーされるひな形(/etc/skel)を見ると理由がはっきりします。

$ ls -a /etc/skel
.  ..  .bash_logout  .bashrc  .profile

.bash_logout / .bashrc / .profile の3つだけで、.bash_profileはありません。Debian系は~/.profileを標準の入り口として使う方針だからです。

OS・環境ごとの場所と既定ファイル

環境 ホームの場所 既定で用意されるファイル
Ubuntu / Debian /home/ユーザー名 .profile.bash_profileは無い)
RHEL / CentOS / AlmaLinux / Rocky /home/ユーザー名 .bash_profile(あらかじめ用意される)
macOS(Catalina以降) /Users/ユーザー名 既定シェルがzshのため.zprofile。Bashを使う場合は自分で.bash_profileを作る
Windows の Git Bash C:\Users\ユーザー名 無い。自分で.bash_profileを作成する
WSL(Ubuntu) /home/ユーザー名 .profile(Ubuntuと同じ)

無い場合は、単に新規作成すれば次回のログインから読み込まれます。ただしUbuntu系で新規作成するときは後述の注意点があります

# 無ければ作る(存在する場合は中身を消さないよう追記モードで開く)
touch ~/.bash_profile
vi ~/.bash_profile

読み込み順を実測で確認する

Bashはログインシェルとして起動すると、まず全ユーザー共通の/etc/profileを読み、その後~/.bash_profile~/.bash_login~/.profile の順に探し、最初に見つかった1つだけを読み込んで残りは無視します。実際に3つとも置いて確かめます。

$ printf 'echo "[.bash_profile] 読み込まれた"\n' > ~/.bash_profile
$ printf 'echo "[.bash_login] 読み込まれた"\n'   > ~/.bash_login
$ printf 'echo "[.profile] 読み込まれた"\n'      > ~/.profile

$ bash -l -c 'exit'
[.bash_profile] 読み込まれた

$ rm ~/.bash_profile
$ bash -l -c 'exit'
[.bash_login] 読み込まれた

$ rm ~/.bash_login
$ bash -l -c 'exit'
[.profile] 読み込まれた

3つ置いても出力は毎回1行だけです。「全部読まれる」のではなく「1つだけ読まれる」という点が重要です。

一方、非ログインの対話シェル(端末を新しく開いたときなど)では~/.bashrcだけが読まれます。

$ bash -i -c 'exit'
[.bashrc] 読み込まれた

.bashrcとの違い早見表

項目 ~/.bash_profile ~/.bashrc
読み込まれるタイミング ログインシェルの起動時(1回だけ) 対話シェルを起動するたび毎回
典型的な場面 SSHログイン、su -bash -l 端末アプリを新しく開く、bashと打つ
書くべき内容 PATHなどの環境変数、1度だけ実行したい処理 エイリアス、シェル関数、プロンプト、補完設定
子プロセスへの継承 exportした変数は継承される エイリアスや関数は継承されない
Ubuntuでの既定 存在しない 存在する

迷ったときの原則は「環境変数は.bash_profile、エイリアスと関数は.bashrcです。.bashrc側の書き方はbashrcとは?書き方・設定例をわかりやすく解説(.profileとの違いも)で詳しく扱っています。

【要注意】.bash_profileを作るとエイリアスが消える

Ubuntu系で最も多いトラブルがこれです。Ubuntuの~/.profileには、~/.bashrcを読み込む処理が書かれています

$ cat /etc/skel/.profile
# ~/.profile: executed by the command interpreter for login shells.
# This file is not read by bash(1), if ~/.bash_profile or ~/.bash_login
# exists.
(中略)
# if running bash
if [ -n "$BASH_VERSION" ]; then
    # include .bashrc if it exists
    if [ -f "$HOME/.bashrc" ]; then
	. "$HOME/.bashrc"
    fi
fi

コメントにThis file is not read by bash(1), if ~/.bash_profile or ~/.bash_login exists.と明記されています。つまり~/.bash_profileを新規作成した瞬間に~/.profileが読まれなくなり、連鎖して~/.bashrcも読み込まれなくなります。実際に確認します。

# .bashrc に alias を定義しておく
$ echo 'alias ll="ls -la"' >> ~/.bashrc

# (A) .bash_profile が無い状態 → .profile 経由で .bashrc が読まれる
$ bash -l -c 'alias ll'
alias ll='ls -la'

# (B) .bash_profile を作成する
$ echo 'export PATH="$HOME/bin:$PATH"' > ~/.bash_profile

# .profile が無視され、.bashrc も読まれなくなる
$ bash -l -c 'alias ll'
bash: line 1: alias: ll: not found

SSHでログインした途端にllなどのエイリアスが使えなくなるのはこれが原因です。

対策:.bash_profileの先頭で.bashrcを読み込む

Ubuntu系で~/.bash_profileを作る場合は、必ず冒頭に.bashrcを読み込む3行を入れてください。RHEL系の既定の.bash_profileも同じことをしています。

# ~/.bash_profile の先頭に置く
if [ -f "$HOME/.bashrc" ]; then
  . "$HOME/.bashrc"
fi

これを入れておけば、ログインシェルでも非ログインシェルでも.bashrcの内容が有効になります。

.bash_profileの基本設定

環境変数を設定する

exportを付けて宣言すると、そのシェルから起動した子プロセスにも値が引き継がれます。

export EDITOR="vim"
export LANG="ja_JP.UTF-8"
export LESS="-R"

exportを付けないとそのシェル内だけの変数になり、実行したコマンドには渡りません。詳しくはexport 意味とは?環境変数を子プロセスに引き継ぐBashコマンドの使い方を参照してください。

PATHを追加する(重複させない書き方)

PATHの追加は.bash_profileの主目的の一つですが、素朴に書くとsourceのたびに同じパスが積み上がります。

# よくある書き方
$ cat ~/.bash_profile
export PATH="$HOME/bin:$PATH"

# source を3回実行すると…
$ source ~/.bash_profile; source ~/.bash_profile; source ~/.bash_profile
$ echo "$PATH"
/home/mugi/bin:/home/mugi/bin:/home/mugi/bin:/usr/bin:/bin

同じディレクトリが3つ並んでしまいました。動作自体は壊れませんが、PATHが肥大化して見通しが悪くなります。すでに含まれているかを判定してから追加すると重複しません。

# ~/.bash_profile
case ":$PATH:" in
  *":$HOME/bin:"*) ;;
  *) export PATH="$HOME/bin:$PATH" ;;
esac
$ source ~/.bash_profile; source ~/.bash_profile; source ~/.bash_profile
$ echo "$PATH"
/home/mugi/bin:/usr/bin:/bin

何度読み込んでも1つのままです。前後を:で挟んで比較しているのは、/home/mugi/bin2のような部分一致を誤判定しないためです。

プロンプト(PS1)をカスタマイズする

export PS1='\u@\h:\w\$ '
記号 意味
\u ユーザー名
\h ホスト名(最初のドットまで)
\w カレントディレクトリ(フルパス)
\W カレントディレクトリ(末尾のみ)
\$ 一般ユーザーなら$、rootなら#
\t 現在時刻(24時間表記)

本番サーバーで色を変えて事故を防ぐ、といった使い方もできます。なおPS1は対話シェルごとに必要なので、.bashrcに書くほうが確実です。

エイリアスと関数でカスタマイズする

エイリアスの作成

alias ll='ls -la'
alias gs='git status'
alias ..='cd ..'

エイリアスは子プロセスに継承されず、対話シェルでしか展開されません。そのため.bash_profileではなく.bashrcに書くのが定石です。指定方法や解除の仕方はalias – コマンドに別名を設定するコマンドにまとめています。

関数の追加

mkcd() {
  mkdir -p "$1" && cd "$1"
}

extract() {
  case "$1" in
    *.tar.gz|*.tgz) tar xzf "$1" ;;
    *.tar.bz2)      tar xjf "$1" ;;
    *.zip)          unzip "$1"   ;;
    *) echo "対応していない形式です: $1" >&2; return 1 ;;
  esac
}

mkcdはディレクトリを作ってそのまま移動します。cdはシェル自身の状態を変えるため、スクリプトファイルではなく関数やエイリアスでなければ意味がありません。関数もエイリアス同様、.bashrcに置きます。

変更を反映する方法

編集しただけでは、すでに開いているシェルには反映されません。反映方法は4つあります。

方法 コマンド 特徴
現在のシェルに読み込む source ~/.bash_profile 最短。ただし削除した設定は消えない
同上(POSIX形式) . ~/.bash_profile sourceと同じ。shでも使える
シェルを入れ替える exec bash -l まっさらな状態で読み直せる。確認に最適
ログインし直す exitして再ログイン 実際のログイン時と同じ経路を検証できる
$ source ~/.bash_profile
$ echo "$PATH"

sourceは「追加で読み込む」だけという点に注意してください。.bash_profileから行を削除しても、すでにメモリ上にある変数やエイリアスは残ります。削除が効いているか確認したいときはexec bash -lで入れ替えます。sourceそのものの挙動はsource – 現在のシェルでファイルのコマンドを実行するで解説しています。

そのまま使えるテンプレート

Ubuntu / WSL / Git Bash で共通して使える最小構成です。

# ~/.bash_profile

# 1) 非ログインシェル用の設定も必ず読み込む(Ubuntuでは必須)
if [ -f "$HOME/.bashrc" ]; then
  . "$HOME/.bashrc"
fi

# 2) 個人用の実行ファイル置き場を PATH へ(重複させない)
for d in "$HOME/bin" "$HOME/.local/bin"; do
  [ -d "$d" ] || continue
  case ":$PATH:" in
    *":$d:"*) ;;
    *) PATH="$d:$PATH" ;;
  esac
done
export PATH

# 3) 環境変数
export EDITOR="vim"
export LANG="ja_JP.UTF-8"

編集前にバックアップを取っておくと、失敗しても戻せます。

cp ~/.bash_profile ~/.bash_profile.bak

よくあるエラーと対処法

設定が反映されない

最も多いのはファイルの取り違えです。次の順に切り分けます。

  1. 今のシェルがログインシェルか確認する:shopt -q login_shell && echo ログインシェル || echo 非ログインシェル
  2. 非ログインシェルなら、その設定は.bashrcに書く
  3. ログインシェルなのに読まれないなら、~/.bash_profileより優先されるファイルが無いか確認する(読み込まれるのは1つだけ)
# 実際にどれが読まれているか印を付けて確かめる
$ echo 'echo "READ: .bash_profile"' >> ~/.bash_profile
$ bash -l -c 'exit'
READ: .bash_profile

構文エラーでログインできない/エラーが出続ける

.bash_profileに文法ミスがあると、ログインのたびにエラーが表示されます。編集後は実行せずに構文だけチェックできます。

$ bash -n ~/.bash_profile
/home/mugi/.bash_profile: line 3: syntax error near unexpected token `fi'
/home/mugi/.bash_profile: line 3: `fi'

bash -nコマンドを実行せずに構文だけ検査するオプションです。行番号が出るのでそこを直します。

PATHを壊してlsもvimも動かなくなった

export PATH="$HOME/bin"のように:$PATHを書き忘れると、標準のコマンドが一切見つからなくなります。慌てずに絶対パスで復旧します。

# PATHを一時的に戻す
$ export PATH=/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin

# 絶対パス指定なら PATH が壊れていても実行できる
$ /usr/bin/vi ~/.bash_profile

rootになると設定が変わる

su(ハイフン無し)は環境をほぼ引き継ぐため元ユーザーの設定が残り、su -はrootのログインシェルとして起動するのでroot自身の.bash_profileが読まれます。挙動の違いはLinuxでユーザーを切り替えるsuコマンドの使い方で整理しています。

よくある質問(FAQ)

Q1. .bash_profileはどこにありますか?

自分のホームディレクトリ直下(~/.bash_profile)です。隠しファイルなのでls -a ~で確認します。Ubuntu / Debian では既定で存在せず、代わりに~/.profileが使われます。

Q2. .bash_profileが無い場合はどうすればいいですか?

そのまま~/.profileを編集するのが安全です。どうしても~/.bash_profileを使いたい場合は新規作成し、冒頭に.bashrcを読み込む3行を必ず入れてください。入れないとエイリアスなどが読み込まれなくなります。

Q3. .bash_profileと.bashrcはどちらに書けばいいですか?

PATHなどの環境変数は.bash_profile、エイリアス・シェル関数・プロンプトは.bashrcです。判断に迷う場合は.bashrcに書き、.bash_profileからそれを読み込む構成にすると事故が起きません。

Q4. 編集した内容を今すぐ反映するには?

source ~/.bash_profileを実行します。設定を「削除した」ことまで反映したい場合はexec bash -lでシェルごと入れ替えてください。

Q5. .bash_profileと.profileの両方があるとどうなりますか?

~/.bash_profileだけが読まれ、~/.profileは完全に無視されます。~/.bash_profile~/.bash_login~/.profile の順で最初に見つかった1つだけが読み込まれる仕様です。

Q6. Windows(Git Bash)でも使えますか?

使えます。Git Bashは起動時にログインシェルとして動くため、C:\Users\ユーザー名\.bash_profileを作成すれば読み込まれます。エクスプローラーからは作りにくいので、Git Bash上でtouch ~/.bash_profileとしてください。

まとめ

  • .bash_profileの場所は~/.bash_profile。Ubuntu / Debian では既定で存在せず~/.profileが使われる
  • ログインシェルでは.bash_profile.bash_login.profile の順に探し、最初の1つだけを読み込む
  • Ubuntu系で.bash_profileを新規作成するときは、冒頭で.bashrcを読み込まないとエイリアスが消える
  • 環境変数は.bash_profile、エイリアスと関数は.bashrc
  • PATH追加は重複判定を入れる。反映はsource、削除の確認はexec bash -l

あわせて読みたい

Bash玄

はじめまして!Bash玄です。

エンジニアとしてシステム運用に携わる中で、手作業の多さに限界を感じ、Bashスクリプトを活用して業務を効率化したのがきっかけで、この道に入りました。「手作業は負け」「スクリプトはシンプルに」をモットーに、誰でも実践できるBashスクリプトの書き方を発信しています。

このサイトでは、Bashの基礎から実践的なスクリプト作成まで、初心者でもわかりやすく解説しています。少しでも「Bashって便利だな」と思ってもらえたら嬉しいです!

# 好きなこと
- シンプルなコードを書くこと
- コマンドラインを快適にカスタマイズすること
- 自動化で時間を生み出すこと

# このサイトを読んでほしい人
- Bashに興味があるけど、何から始めればいいかわからない人
- 定型業務を自動化したい人
- 効率よくターミナルを使いこなしたい人

Bashの世界に一歩踏み出して、一緒に「Bash道」を極めていきましょう!

Bash玄をフォローする