インフラエンジニアの羅針盤

インフラエンジニア1〜3年目のための技術ガイド

Bash環境変数と設定ファイルの読み込み順序・スコープ解説【LinuC102】

公開
,
LinuC Level 1 第10回 主題1.09 シェルおよびシェルスクリプト



Linuxシステムと対話する際の中心的なインターフェースであるBash(Bourne-Again SHell)は、利用者の目的に応じて動作環境を柔軟にカスタマイズできます。しかし、「シェル変数と環境変数の違いが曖昧」「.bash_profile と .bashrc のどちらに変数を追記すべきか判断できない」という疑問は、初学者が直面しやすい代表的なハードルです。本稿はLinuC 102試験の開幕トピックとして、主題1.06.1「シェル環境のカスタマイズ」で出題される変数のスコープ、主要環境変数の役割、エイリアス定義、そしてログインシェルと非ログインシェルにおける設定ファイルの完全な読み込み順序を、実機検証ログとともに論理的に解説します。

  • シェル変数と環境変数のスコープの相違、およびexportコマンドによる子プロセスへの環境変数継承メカニズムを説明できる状態を目指します
  • LinuC試験で頻出する主要環境変数(PATH, HOME, HISTSIZE, PS1等)の用途と確認コマンド(env, printenv, set)を理解します
  • エイリアス(alias, unalias)の定義と、エイリアスを一時的に無効化して実行する記法を習得します
  • ログインシェルと非ログインシェルにおける設定ファイル(/etc/profile, ~/.bash_profile, ~/.bashrc)の読み込みフローを把握します
  • sourceコマンド(または.)による設定ファイルの即時反映手順を身につけます
項目 仕様・設定値
検証機ホスト名 linuc-node01
ディストリビューション AlmaLinux 9.8 (Olive Jaguar)
シェル環境 GNU bash, バージョン 5.1.8(1)-release (x86_64-redhat-linux-gnu)
検証ユーザー user01(UID: 1000 / 一般ユーザー)
対象試験 LinuC レベル1 102試験(主題1.06.1 重要度4)
目次
  1. 1. シェル変数と環境変数のスコープ・継承メカニズム
    1. 1.1 シェル変数(ローカルスコープ)の定義と参照
    2. 1.2 環境変数(グローバルスコープ)と子プロセスへの継承
    3. 1.3 exportコマンドによる環境変数への昇格
    4. 1.4 変数の確認コマンド比較(set, env, printenv)
    5. 1.5 変数と関数の破棄(unset)
  2. 2. LinuC 102試験で頻出の主要環境変数一覧
  3. 3. コマンドエイリアス(alias)とシェル関数
    1. 3.1 エイリアスの作成(alias)と一覧確認
    2. 3.2 エイリアスの削除(unalias)
    3. 3.3 エイリアスを一時的に無効化して実体コマンドを実行する手法
    4. 3.4 シェル関数の定義と呼び出し
  4. 4. Bash設定ファイルの読み込み順序と実行ライフサイクル
    1. 4.1 ログインシェル(Login Shell)起動時の読み込みフロー
    2. 4.2 非ログイン対話型シェル(Interactive Non-login Shell)起動時の読み込みフロー
    3. 4.3 ログアウト時の処理(~/.bash_logout)
    4. 4.4 設定の即時反映コマンド(source と .)
  5. 5. 実機ハンズオン演習:AlmaLinux 9で環境変数と設定ファイルを検証
    1. 5.1 実機検証環境の確認
    2. 5.2 演習1:シェル変数と環境変数の子プロセス継承挙動の検証
    3. 5.3 演習2:~/.bash_profile と ~/.bashrc の連鎖読み込み構造の確認
    4. 5.4 演習3:PATH変数の追加とsourceによる即時反映
  6. 6. LinuC 102試験対策まとめとコマ問頻出チェック
    1. 6.1 コマ問(記述式)頻出キーワード一覧表
    2. 6.2 Ping-t演習へのブリッジ(対象分野と推奨学習順)
  7. 7. まとめと次回予告

1. シェル変数と環境変数のスコープ・継承メカニズム

Bash内部で扱われる変数には、「シェル変数」と「環境変数」という2種類の異なるスコープが存在します。この2つの境界線を正確に理解することが、トラブルシューティングや試験対策の第一歩となります。

Bashにおけるシェル変数と環境変数のスコープと継承
図1: Bashにおけるシェル変数と環境変数のスコープ・子プロセス継承

1.1 シェル変数(ローカルスコープ)の定義と参照

シェル変数とは、現在起動しているBashプロセス自身のメモリ空間内でのみ有効な変数です。代入演算子(=)の前後にスペースを入れずに記述することで定義します。

[user01@linuc-node01 ~]$ MY_VAR="CentOS"
[user01@linuc-node01 ~]$ echo $MY_VAR
CentOS

シェル変数は現在のシェル内では自由に参照・変更できますが、新しく起動した子シェルや外部コマンド(子プロセス)には引き継がれません

1.2 環境変数(グローバルスコープ)と子プロセスへの継承

親プロセスから子プロセスへとメモリ値が自動的にコピー・継承される変数を環境変数と呼びます。Linux上でプログラムが起動する際、OSカーネルは親プロセスの環境変数一覧を子プロセスのメモリ領域へ複製して渡します。

注意すべき重要な原則として、「継承は親から子への一方通行である」という点があります。子プロセス内で環境変数の値を変更したり新規作成したりしても、その変更が親プロセスの環境変数に逆流することはありません。

1.3 exportコマンドによる環境変数への昇格

定義済みのシェル変数を環境変数へと昇格させる(子プロセスへの継承フラグを付与する)には、exportコマンドを使用します。

# 1. シェル変数を定義してからexportする場合
[user01@linuc-node01 ~]$ SERVER_ROLE="web"
[user01@linuc-node01 ~]$ export SERVER_ROLE

# 2. 変数定義と同時にexportする場合(推奨形式)
[user01@linuc-node01 ~]$ export SERVER_ROLE="web"

1.4 変数の確認コマンド比較(set, env, printenv)

変数を一覧表示するコマンドには、対象範囲に応じた使い分けが存在します。

コマンド名 種別 表示される対象
set Bash組込コマンド シェル変数、環境変数、およびシェル関数の全項目を出力する。
env 外部コマンド(/usr/bin/env) 環境変数のみを出力する(一時的に環境変数を変更して別コマンドを起動する機能も持つ)。
printenv 外部コマンド(/usr/bin/printenv) 環境変数のみを出力する。引数に変数名を指定するとその値のみを出力可能(例: printenv PATH)。

1.5 変数と関数の破棄(unset)

定義した変数や関数をメモリから削除するには、unsetコマンドを使用します。

[user01@linuc-node01 ~]$ unset SERVER_ROLE
[user01@linuc-node01 ~]$ echo $SERVER_ROLE
(空文字が出力される)

シェル関数を削除したい場合は、unset -f <関数名>と指定します。

2. LinuC 102試験で頻出の主要環境変数一覧

BashおよびLinuxシステムが標準で利用している環境変数は、記述式問題を含めて頻繁に出題されます。

環境変数名 格納される内容 具体例(AlmaLinux 9実機値)
PATH コマンド実行時に実行ファイルを探索するディレクトリのリスト(コロン区切り) /usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin
HOME カレントユーザーのホームディレクトリの絶対パス /home/user01
USER / LOGNAME 現在ログインしているユーザーのアカウント名 user01
SHELL ユーザーのログインシェル(パス) /bin/bash
HISTSIZE メモリ内に保持するコマンド履歴(ヒストリ)の最大件数 1000
HISTFILE ログアウト時にコマンド履歴を保存するファイルのパス /home/user01/.bash_history
HISTFILESIZE 履歴ファイル(~/.bash_history)に保存できる最大行数 2000
HISTCONTROL 履歴記録の制御(ignorespace: 空白開始行を除外, ignoredups: 連続重複を除外) ignoredups
PS1 プロンプトの第1階層(通常の入力待ち受けプロンプト)の表示書式 [u@h W]$
PS2 コマンドが複数行にわたる場合の継続プロンプト >
LANG システムの文字コードおよび言語ロケール ja_JP.UTF-8(または en_US.UTF-8
TERM 端末エミュレータの種別(制御シーケンスの定義) xterm-256color
PWD / OLDPWD 現在の作業ディレクトリ / 1つ前にいた直前の作業ディレクトリ(cd -で参照) /home/user01

PATH環境変数へのディレクトリ追加手順:既存の探索パスを上書きして破壊しないよう、必ずexport PATH=$PATH:/new/directory/bin(末尾追加)またはexport PATH=/new/directory/bin:$PATH(先頭追加)の形式で既存の$PATHを含めて記述します。

3. コマンドエイリアス(alias)とシェル関数

頻繁に入力する長いコマンドや共通オプションを短い別名で登録する仕組みが「エイリアス」です。

3.1 エイリアスの作成(alias)と一覧確認

引数なしでaliasを実行すると、現在定義されているエイリアスの一覧が出力されます。

[user01@linuc-node01 ~]$ alias
alias egrep='egrep --color=auto'
alias fgrep='fgrep --color=auto'
alias grep='grep --color=auto'
alias l.='ls -d .* --color=auto'
alias ll='ls -l --color=auto'
alias ls='ls --color=auto'

新しいエイリアスを作成するには、alias 別名='実行コマンド'の形式で指定します。

[user01@linuc-node01 ~]$ alias rm='rm -i'

3.2 エイリアスの削除(unalias)

登録されたエイリアスを無効化・削除するにはunaliasを使用します。

[user01@linuc-node01 ~]$ unalias rm

登録されているすべてのエイリアスを一括削除したい場合はunalias -aを実行します。

3.3 エイリアスを一時的に無効化して実体コマンドを実行する手法

エイリアスが設定されているコマンド(例: rmrm -i になっている状態)において、確認プロンプトを出さずにオリジナルのrmを実行したい場合があります。その際は以下の手法を用います。

  • バックスラッシュを先頭に付与: rm file.txt(最も簡便・実務で頻用)
  • command組込コマンドを使用: command rm file.txt
  • 絶対パスで実行: /usr/bin/rm file.txt

3.4 シェル関数の定義と呼び出し

引数を伴う複雑な処理や条件分岐を含むカスタム処理は、エイリアスではなく「シェル関数」として定義します。

# 引数で受け取ったディレクトリを作成して直ちに移動する関数
mkcd() {
    mkdir -p "$1" && cd "$1"
}

4. Bash設定ファイルの読み込み順序と実行ライフサイクル

Bashの設定を永続化(再ログイン後も保持)するためには、適切な設定ファイルへ記述する必要があります。シェルが「ログインシェル」として起動したのか、それとも「非ログインシェル」として起動したのかによって、読み込まれるファイルの順序と対象が決定的に異なります。

Bash設定ファイルの読み込み順序と実行フロー
図2: Bash 設定ファイルの読み込み順序と実行フロー(完全マップ)

4.1 ログインシェル(Login Shell)起動時の読み込みフロー

ユーザー認証(SSHログイン、テキストコンソールログイン、またはsu - <user>での切り替え)を経て起動するシェルを「ログインシェル」と呼びます。ログインシェルは以下の厳密な順序で設定ファイルを探索・実行します。

  • ステップ1:システム共通設定ファイル

    /etc/profile が最初に実行され、全ユーザー共通の基本環境変数やumaskが設定されます。さらに、この内部から /etc/profile.d/*.sh が一括読み込みされます。

  • ステップ2:ユーザー固有設定ファイル(探索優先順位)

    ユーザーのホームディレクトリ直下にある以下の3つのファイルのうち、最初に見つかった1つだけを実行し、残りは無視します。

    1. ~/.bash_profile(第1候補・Red Hat系等の標準)
    2. ~/.bash_login(第2候補)
    3. ~/.profile(第3候補・Debian/Ubuntu系の標準)
  • ステップ3:連鎖読み込み(スクリプト内の記述による展開)

    標準の~/.bash_profile内には、通常「if [ -f ~/.bashrc ]; then . ~/.bashrc; fi」という記述が含まれているため、結果として後述の~/.bashrcも連鎖実行されます。

4.2 非ログイン対話型シェル(Interactive Non-login Shell)起動時の読み込みフロー

GUI環境のデスクトップ上で端末エミュレータ(GNOME Terminal等)を新規起動した場合や、既存の端末内で単にbashコマンドを実行した場合、認証を伴わない「非ログイン対話型シェル」となります。

この場合、親プロセスからすでに環境変数を引き継いでいるため、/etc/profile~/.bash_profile は読み込まれません。以下のファイルのみが直接実行されます。

  • ~/.bashrc: ユーザー固有のエイリアスや関数の定義。
  • /etc/bashrc(Debian系では/etc/bash.bashrc): ~/.bashrc内部から連鎖的に呼び出されるシステム共通の対話設定。

4.3 ログアウト時の処理(~/.bash_logout)

ログインシェルを終了(exitやログアウト)する際、ホームディレクトリに ~/.bash_logout ファイルが存在すれば、その内容が最後に実行されます。一般的には端末画面のクリア(clearコマンド)や一時ファイルの消去処理などが記述されます。

4.4 設定の即時反映コマンド(source と .)

~/.bashrc などの設定ファイルを編集した際、一度ログアウトして再ログインすることなく現在のシェルプロセスに即座に変更内容を読み込ませるには、sourceコマンド(または同義のドットコマンド .)を使用します。

[user01@linuc-node01 ~]$ source ~/.bashrc
# または
[user01@linuc-node01 ~]$ . ~/.bashrc

単にbash ~/.bashrcと実行すると、新しい子シェルが立ち上がってその中でファイルが実行され、終了と同時に変数が破棄されてしまいます。現在のカレントシェルに変数を反映させるには、必ずsourceまたは.を用いてカレントプロセス内でスクリプトを展開する必要があります。

5. 実機ハンズオン演習:AlmaLinux 9で環境変数と設定ファイルを検証

実機linuc-node01を用いて、変数の子プロセス継承動作と設定ファイルの連鎖構造を検証します。

5.1 実機検証環境の確認

ホームディレクトリに配置されているBash関連設定ファイルの一覧を確認します。

[user01@linuc-node01 ~]$ ls -la ~ | grep bash
-rw-------.  1 user01 user01 1254  9月  8 07:11 .bash_history
-rw-r--r--.  1 user01 user01   18  5月 19 16:33 .bash_logout
-rw-r--r--.  1 user01 user01  141  5月 19 16:33 .bash_profile
-rw-r--r--.  1 user01 user01  492  5月 19 16:33 .bashrc

5.2 演習1:シェル変数と環境変数の子プロセス継承挙動の検証

通常のシェル変数とexportした環境変数が、子シェル内でどのように扱われるかを比較検証します。

# 1. 親シェルで2つの変数を定義
[user01@linuc-node01 ~]$ LOCAL_VAR="local_only"
[user01@linuc-node01 ~]$ export GLOBAL_VAR="inherited"

# 2. 子シェル(bash)を新しく起動
[user01@linuc-node01 ~]$ bash

# 3. 子シェル内で値を確認
[user01@linuc-node01 ~]$ echo "LOCAL: $LOCAL_VAR"
LOCAL: 
[user01@linuc-node01 ~]$ echo "GLOBAL: $GLOBAL_VAR"
GLOBAL: inherited

# 4. 子シェルを終了して親シェルへ復帰
[user01@linuc-node01 ~]$ exit
exit
[user01@linuc-node01 ~]$ unset LOCAL_VAR GLOBAL_VAR

5.3 演習2:~/.bash_profile と ~/.bashrc の連鎖読み込み構造の確認

実機の~/.bash_profileがどのように記述されているかを調査します。

[user01@linuc-node01 ~]$ cat ~/.bash_profile
# .bash_profile

# Get the aliases and functions
if [ -f ~/.bashrc ]; then
	. ~/.bashrc
fi

# User specific environment and startup programs

.bash_profile内で条件分岐if [ -f ~/.bashrc ]を用いて~/.bashrcをドットコマンド(.)で読み込んでいることが確認できます。

5.4 演習3:PATH変数の追加とsourceによる即時反映

ユーザー専用のスクリプト格納用ディレクトリ(~/mybin)を作成し、探索パスに追加して即座に有効化します。

# 1. ディレクトリ作成
[user01@linuc-node01 ~]$ mkdir -p ~/mybin

# 2. ~/.bashrc の末尾に PATH 追加設定を追記
[user01@linuc-node01 ~]$ echo 'export PATH=$PATH:$HOME/mybin' >> ~/.bashrc

# 3. source コマンドで即時反映
[user01@linuc-node01 ~]$ source ~/.bashrc

# 4. PATH に ~/mybin が追加されたことを確認
[user01@linuc-node01 ~]$ echo $PATH | grep 'mybin'
/home/user01/.local/bin:...:/home/user01/mybin

# 5. 検証後のクリーンアップ(末尾行の削除)
[user01@linuc-node01 ~]$ sed -i '/mybin/d' ~/.bashrc
[user01@linuc-node01 ~]$ source ~/.bashrc && rmdir ~/mybin

6. LinuC 102試験対策まとめとコマ問頻出チェック

主題1.06.1から、記述式(コマ問)として出題されやすい重要キーワードを整理します。

6.1 コマ問(記述式)頻出キーワード一覧表

以下の設問に対するコマンド名、環境変数名、またはファイルパスを想起してください。

  • 問題1: 定義済みのシェル変数を環境変数に昇格させ、子プロセスに継承可能にするコマンドは何か?
  • 問題2: 環境変数やシェル変数をメモリ上から削除・破棄するコマンドは何か?
  • 問題3: 環境変数のみを一覧表示する、外部コマンドの名称は何か?(2つ)
  • 問題4: ログインシェル起動時、ホームディレクトリ直下で ~/.bash_profile が存在しない場合に次に探索されるファイル名は何か?
  • 問題5: 編集した ~/.bashrc の内容をログアウトせずに現在のシェルへ即時反映させるコマンドは何か?(2つ)
  • 問題6: コマンド履歴において、メモリ上に保持する最大履歴件数を指定する環境変数は何か?
  • 問題7: 登録されているすべてのエイリアスを一括削除するunaliasコマンドのオプションは何か?
解答と解説を見る
設問 正解(記述内容) 補足・別解
問題1 export export VAR=value
問題2 unset 関数削除はunset -f
問題3 envprintenv setはシェル変数も含む
問題4 ~/.bash_login その次は~/.profile
問題5 source ~/.bashrc. ~/.bashrc ドット単体も正解
問題6 HISTSIZE ファイル保存件数はHISTFILESIZE
問題7 unalias -a -a(all)オプション

6.2 Ping-t演習へのブリッジ(対象分野と推奨学習順)

LinuC 102試験における「シェル環境のカスタマイズ」は、問題文の細かい文脈(ログインシェルか非ログインシェルか、シェル変数か環境変数か)を見落とさなければ確実に満点を狙える得点源分野です。

  • 主題1.06:シェルおよびシェルスクリプト
    • 「シェル環境のカスタマイズ」分野(重要度4):~/.bash_profile~/.bash_login~/.profile の順序、exportunsetsource、各環境変数のスペルをコマ問でノーミスになるまで演習します。

7. まとめと次回予告

  • シェル変数はローカル限定ですが、exportを実行することで環境変数となり子プロセスへ継承されます
  • 全変数を表示するset、環境変数のみを表示するenv / printenv、変数を削除するunsetを使い分けます
  • ログインシェル起動時のユーザーファイル探索順序は「~/.bash_profile~/.bash_login~/.profile」の先着1つです
  • 非ログイン対話型シェルでは~/.bashrcが直接読まれ、/etc/profileは読み込まれません
  • 設定ファイルの変更を即時反映するにはsource ~/.bashrcまたは. ~/.bashrcを実行します

次回はLinuC 102試験における最重要トピック(全主題中最高となる重要度6)の主題1.06.2より、「簡単なスクリプトの作成(Bashシェルスクリプト徹底習得)」をお届けします。シバン(shebang)、位置パラメータ、条件分岐(if / test / [ ] / [[ ]])、ループ制御(for / while)、および終了ステータス判定の極意を解説します。

前の記事
次の記事