用語
ログインシェル
ログインシェルとは、ユーザーがシステムにログインしたときに最初に起動される対話型のシェル(コマンド操作環境)のことです。ユーザーの設定ファイル(.bash_profileや.profileなど)を読み込んで環境変数やエイリアスを設定し、コマンド入力を受け付ける準備をします。代表的なログインシェルにはbash、zsh、fishなどがあり、ユーザーごとに好みのシェルを指定できます。
インタラクティブシェル
インタラクティブシェルとは、ユーザーがコマンドを入力し、その結果を対話的に受け取れるシェルのことです。
具体例:
-
インタラクティブシェル: ターミナルを開いて
lsやcdなどのコマンドを打つ通常の操作 - 非インタラクティブシェル: シェルスクリプトの実行(ユーザーとの対話なし)
ログインシェルとの違い:
-
ログインシェル: ログイン時に起動(
.bash_profileや.profileを読む) -
インタラクティブシェル: ターミナルを新しく開いたとき(
.bashrcを読む)
GUI環境の例
RDPでログインした後にTerminalアプリを開く
- RDPログイン時:ログインシェルが起動
- その後Terminalを開く:インタラクティブシェル(非ログインシェル)が起動
白地のコマンドでLinuxを操作できる部分がインタラクティブシェル

CUI環境の例(Teratermなど)
- Teratermで最初にSSH接続 → ログインシェル起動
-
その後、
bashコマンドを実行 → 新しいインタラクティブシェル(非ログインシェル)が起動
# 最初のログイン(ログインシェル)
user@server:~$ echo $0
-bash # 先頭の「-」がログインシェルの印
# 新しいシェルを起動
user@server:~$ bash
# 新しいシェル(インタラクティブだが非ログインシェル)
user@server:~$ echo $0
bash # 「-」がない = 非ログインシェル
# ログインシェルに戻る
user@server:~$ exit
-bash # 先頭の「-」がログインシェルの印
bashやzshなどとは何か?
こっちでも書いてますが、、、
ターミナルで入力された「ls」や「cd」といった文字を受け取って、「あ、ファイル一覧を表示するんだな」と理解し、コンピュータ(OS)に命令を伝える翻訳機です。
誤りを指摘頂きましたので再確認しました。この辺りは、もう少し正確に確認していきたいと思います。取り急ぎご指摘ありがとうございました。
シェルは「ls」という名前の**外部プログラム(実行ファイル)を探し、それを実行(起動)をカーネルに依頼するだけの「受付」**に過ぎません
以下の記事の図が個人的にはかなりしっくりきました。
ログインシェル設定ファイル読込順序
Feloと呼ばれるAIに出力させてみました。
ログインシェル関係のユーザ設定ファイル
bashを使うのであれば、シェル列がbashのものを使います。bashを使うのにzshを使う的なことは基本的にはしません。
| 順序 | ファイル名 | シェル | 読み込みタイミング | 用途 |
|---|---|---|---|---|
| 1 | /etc/profile | bash/zsh等 | ログインシェル起動時(全ユーザ共通) | システム全体の環境変数、パス設定 |
| 1 | /etc/profile.d/*.sh | bash/zsh等 | ログインシェル起動時(全ユーザ共通) | システム全体の追加設定 |
| 2 | .bash_profile | bash | ログインシェル起動時 | 環境変数、パス設定など |
| 2 | .bash_login | bash | ログインシェル起動時(.bash_profileがない場合) | .bash_profileの代替 |
| 2 | .profile | bash/zsh等 | ログインシェル起動時(.bash_profileと.bash_loginがない場合) | sh互換の汎用ログイン設定(環境変数、パス設定など) |
| 2 | .zprofile | zsh | ログインシェル起動時 | zshのログイン時設定 |
| 3 | .bashrc | bash | ログインシェル・インタラクティブシェル起動時 | エイリアス、関数、プロンプト設定 |
| 3 | .zshrc | zsh | インタラクティブシェル起動時 | zshの設定全般 |
| 3 | .config/fish/config.fish | fish | インタラクティブシェル起動時 | fishの設定全般 |
| - | .bash_logout | bash | ログアウト時 | 終了時の処理 |
補足:
- /etc/profile は全ユーザに適用される。管理者が設定するシステム全体の設定
-
.profileはsh互換なので、bash、zsh等の複数のシェルで共通して使えます - Ubuntuなど多くのLinuxディストリビューションでは、
.bash_profileより.profileがデフォルトで使われるらしい - ログインシェルとインタラクティブシェルで読み込まれるファイルが異なるため、bashでは
.bash_profile(または.profile)から.bashrcを呼び出す設定をすることが一般的です
実機確認
Ubuntu24.04で内容を確認してみます。
test@ubuntu-cui:~$ cat /etc/os-release
PRETTY_NAME="Ubuntu 24.04.4 LTS"
NAME="Ubuntu"
VERSION_ID="24.04"
VERSION="24.04.4 LTS (Noble Numbat)"
VERSION_CODENAME=noble
ID=ubuntu
ID_LIKE=debian
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
UBUNTU_CODENAME=noble
LOGO=ubuntu-logo
/etc/profileの確認
if~elseのところでこのファイルの後に何を読み込むのか、という事が書いていますね。
ログインシェルの読込順序というところに着目するなら"if [ -d /etc/profile.d ]; then"でファイルの存在を確認して、もしあるなら". $i"と記載されている通り、それを読み込むという設定が記載されています。
test@ubuntu-cui:~$ cat /etc/profile
# /etc/profile: system-wide .profile file for the Bourne shell (sh(1))
# and Bourne compatible shells (bash(1), ksh(1), ash(1), ...).
if [ "${PS1-}" ]; then
if [ "${BASH-}" ] && [ "$BASH" != "/bin/sh" ]; then
# The file bash.bashrc already sets the default PS1.
# PS1='\h:\w\$ '
if [ -f /etc/bash.bashrc ]; then
. /etc/bash.bashrc
fi
else
if [ "$(id -u)" -eq 0 ]; then
PS1='# '
else
PS1='$ '
fi
fi
fi
if [ -d /etc/profile.d ]; then
for i in /etc/profile.d/*.sh; do
if [ -r $i ]; then
. $i
fi
done
unset i
fi
/etc/profile.d/*.shの確認
/etc/profile.d/配下を確認すると以下のようにファイルが複数個ありました。
これの中で拡張子が.shのものを読み込むという事です。
test@ubuntu-cui:~$ cd /etc/profile.d/
test@ubuntu-cui:/etc/profile.d$ ls -la
total 40
drwxr-xr-x 2 root root 4096 May 2 23:13 .
drwxr-xr-x 108 root root 4096 May 2 23:15 ..
-rw-r--r-- 1 root root 96 Apr 22 2024 01-locale-fix.sh
-rw-r--r-- 1 root root 840 Nov 21 07:08 apps-bin-path.sh
-rw-r--r-- 1 root root 726 Feb 10 00:34 bash_completion.sh
-rw-r--r-- 1 root root 1107 Mar 31 2024 gawk.csh
-rw-r--r-- 1 root root 757 Mar 31 2024 gawk.sh
-rw-r--r-- 1 root root 1557 Feb 10 00:34 Z97-byobu.sh
-rwxr-xr-x 1 root root 841 Aug 12 2025 Z99-cloudinit-warnings.sh
-rwxr-xr-x 1 root root 3396 Aug 12 2025 Z99-cloud-locale-test.sh
それぞれのファイルの意味です。
| ファイル名 | 意味・役割 |
|---|---|
| 01-locale-fix.sh | ロケール(言語・地域設定)の修正。文字化けや言語設定の問題を解決 |
| apps-bin-path.sh | アプリケーションのバイナリパスを追加。PATHにアプリケーションの実行ファイルの場所を追加 |
| bash_completion.sh | Bashのタブ補完機能を有効化。コマンドやファイル名を途中まで入力してTabキーで補完 |
| gawk.csh | gawk(GNU awk)のcsh/tcsh用設定。cshシェル使用時のawk環境設定 |
| gawk.sh | gawk(GNU awk)のbash/sh用設定。bashシェル使用時のawk環境設定 |
| Z97-byobu.sh | byobu(ターミナルマルチプレクサ)の設定。画面分割やセッション管理ツールの初期化 |
| Z99-cloudinit-warnings.sh | cloud-initの警告メッセージ表示。クラウド環境での初期化に関する警告を表示 |
| Z99-cloud-locale-test.sh | クラウド環境でのロケール設定テスト。クラウドインスタンスの言語設定が正しいか確認 |
~/.profileの確認
「/etc/profileとか/etc/profile.d/*.shに~/.profileを読み込むって記載が無くないか?」と思ったので、少し調べたのですが、どうやらbashプログラム自体の仕様で自動で読み込まれるようです。
| どこに書いてある? | 答え |
|---|---|
1 → 2 (/etc/profile → /etc/profile.d/*.sh) |
/etc/profile のスクリプト内に記述 |
2 → 3 (/etc/profile → ~/.profile) |
bashプログラム自体に組み込まれた仕様 |
testユーザでSSHログイン後、カレントディレクトリに対してls -laを実行してみます。.profileの設定ファイルが存在していることがわかると思います。
.bash_loginや.bash_profileは存在していない為、.profileが読み込まれます。
test@ubuntu-cui:~$ pwd
/home/test
test@ubuntu-cui:~$ ls -la
total 32
drwxr-x--- 4 test test 4096 May 2 23:40 .
drwxr-xr-x 3 root root 4096 May 2 23:11 ..
-rw------- 1 test test 13 May 2 23:40 .bash_history
-rw-r--r-- 1 test test 220 Mar 31 2024 .bash_logout
-rw-r--r-- 1 test test 3771 Mar 31 2024 .bashrc
drwx------ 2 test test 4096 May 2 23:15 .cache
-rw-r--r-- 1 test test 807 Mar 31 2024 .profile
drwx------ 2 test test 4096 May 2 23:15 .ssh
-rw-r--r-- 1 test test 0 May 2 23:15 .sudo_as_admin_successful
フローで言うとこうなります。
優先順位が高い2つのファイルが存在しないので、.profileが読み込まれます。

~/.profileファイルで内容を確認できます。
以下は~/.profileを日本語に翻訳したものになります。
test@ubuntu-cui:~$ cat ~/.profile
# ~/.profile: ログインシェル用にコマンドインタプリタによって実行されます。
# このファイルは、~/.bash_profile または ~/.bash_login が存在する場合、
# bash(1) によって読み込まれません。
# 例については /usr/share/doc/bash/examples/startup-files を参照してください。
# これらのファイルは bash-doc パッケージに含まれています。
# デフォルトの umask は /etc/profile で設定されています。ssh ログイン用に
# umask を設定する場合は、libpam-umask パッケージをインストールして設定してください。
#umask 022
# bash を実行している場合
if [ -n "$BASH_VERSION" ]; then
# .bashrc が存在する場合は読み込む
if [ -f "$HOME/.bashrc" ]; then
. "$HOME/.bashrc"
fi
fi
# ユーザー専用の bin ディレクトリが存在する場合、PATH に追加する
if [ -d "$HOME/bin" ] ; then
PATH="$HOME/bin:$PATH"
fi
# ユーザー専用の .local/bin ディレクトリが存在する場合、PATH に追加する
if [ -d "$HOME/.local/bin" ] ; then
PATH="$HOME/.local/bin:$PATH"
fi
~/.bashrcの確認
フローのこの部分になります。
ここはログインシェルでもインタラクティブシェルでも読み込まれる部分になります。

.bashrcの中身を確認してみます。
同様にcatで出力したものに対してAIを使って日本語訳をかけています。
test@ubuntu-cui:~$ cat .bashrc
# ~/.bashrc: 非ログインシェル用に bash(1) によって実行されます。
# インタラクティブモードでない場合は何もしない
case $- in
*i*) ;;
*) return;; # bashなどで起動した場合はここでreturnが走って読込終了となる
esac
# 履歴に重複行やスペースで始まる行を保存しない
HISTCONTROL=ignoreboth
# 履歴ファイルに追記する(上書きしない)
shopt -s histappend
# 履歴の保存件数設定
HISTSIZE=1000
HISTFILESIZE=2000
# 各コマンド実行後にウィンドウサイズをチェックし、必要に応じて LINES と COLUMNS を更新
shopt -s checkwinsize
# プロンプトの設定(色付き)
if [ "$color_prompt" = yes ]; then
PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ '
else
PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w\$ '
fi
# ls の色付け有効化と便利なエイリアス
alias ls='ls --color=auto'
alias grep='grep --color=auto'
# よく使う ls のエイリアス
alias ll='ls -alF' # 詳細表示(隠しファイル含む)
alias la='ls -A' # 隠しファイルも表示
alias l='ls -CF' # コンパクト表示
# エイリアス定義ファイルがあれば読み込む
if [ -f ~/.bash_aliases ]; then
. ~/.bash_aliases
fi
# プログラマブル補完機能を有効化(Tab補完の強化)
if ! shopt -oq posix; then
if [ -f /usr/share/bash-completion/bash_completion ]; then
. /usr/share/bash-completion/bash_completion
elif [ -f /etc/bash_completion ]; then
. /etc/bash_completion
fi
fi






