0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【図解】ログイン/インタラクティブシェルの違いと設定ファイルの読み込み順序

0
Last updated at Posted at 2026-05-03

用語

ログインシェル

ログインシェルとは、ユーザーがシステムにログインしたときに最初に起動される対話型のシェル(コマンド操作環境)のことです。ユーザーの設定ファイル(.bash_profile.profileなど)を読み込んで環境変数やエイリアスを設定し、コマンド入力を受け付ける準備をします。代表的なログインシェルにはbashzshfishなどがあり、ユーザーごとに好みのシェルを指定できます。

インタラクティブシェル

インタラクティブシェルとは、ユーザーがコマンドを入力し、その結果を対話的に受け取れるシェルのことです。

具体例:

  • インタラクティブシェル: ターミナルを開いてlscdなどのコマンドを打つ通常の操作
  • 非インタラクティブシェル: シェルスクリプトの実行(ユーザーとの対話なし)

ログインシェルとの違い:

  • ログインシェル: ログイン時に起動(.bash_profile.profileを読む)
  • インタラクティブシェル: ターミナルを新しく開いたとき(.bashrcを読む)

シェルの種類シンプル図解.png

GUI環境の例

RDPでログインした後にTerminalアプリを開く

  • RDPログイン時:ログインシェルが起動
  • その後Terminalを開く:インタラクティブシェル(非ログインシェル)が起動

端末と記載されているアプリがTerminal
image.png

白地のコマンドでLinuxを操作できる部分がインタラクティブシェル
image.png

CUI環境の例(Teratermなど)

  1. Teratermで最初にSSH接続 → ログインシェル起動
  2. その後、bashコマンドを実行 → 新しいインタラクティブシェル(非ログインシェル)が起動
# 最初のログイン(ログインシェル)
user@server:~$ echo $0
-bash  # 先頭の「-」がログインシェルの印

# 新しいシェルを起動
user@server:~$ bash

# 新しいシェル(インタラクティブだが非ログインシェル)
user@server:~$ echo $0
bash  # 「-」がない = 非ログインシェル

# ログインシェルに戻る
user@server:~$ exit
-bash # 先頭の「-」がログインシェルの印

bashやzshなどとは何か?

こっちでも書いてますが、、、

ターミナルで入力された「ls」や「cd」といった文字を受け取って、「あ、ファイル一覧を表示するんだな」と理解し、コンピュータ(OS)に命令を伝える翻訳機です。

誤りを指摘頂きましたので再確認しました。この辺りは、もう少し正確に確認していきたいと思います。取り急ぎご指摘ありがとうございました。

シェルは「ls」という名前の**外部プログラム(実行ファイル)を探し、それを実行(起動)をカーネルに依頼するだけの「受付」**に過ぎません
以下の記事の図が個人的にはかなりしっくりきました。

LPIC1-ページ-22.drawio (1).png

ログインシェル設定ファイル読込順序

Feloと呼ばれるAIに出力させてみました。

ログインシェル読込順序と優先順位フロー図(高解像度版) (2).png

ログインシェル関係のユーザ設定ファイル

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の確認

先程のフローで言うと赤枠の部分です。
ログインシェル読込順序と優先順位フロー図(高解像度版) (2)-01.png

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の確認

フローで言うと赤枠の部分です。
ログインシェル読込順序と優先順位フロー図(高解像度版) (2)-02.png

/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の確認

フローのこの部分になります。
ログインシェル読込順序と優先順位フロー図(高解像度版) (2)-03.png

「/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が読み込まれます。
ログインシェル読込順序と優先順位フロー図(高解像度版) (2)-04.png

~/.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の確認

フローのこの部分になります。
ここはログインシェルでもインタラクティブシェルでも読み込まれる部分になります。
ログインシェル読込順序と優先順位フロー図(高解像度版) (2)-05.png

.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
0
1
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?