結論:.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
よくあるエラーと対処法
設定が反映されない
最も多いのはファイルの取り違えです。次の順に切り分けます。
- 今のシェルがログインシェルか確認する:
shopt -q login_shell && echo ログインシェル || echo 非ログインシェル - 非ログインシェルなら、その設定は
.bashrcに書く - ログインシェルなのに読まれないなら、
~/.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
