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. シェル変数と環境変数のスコープ・継承メカニズム
Bash内部で扱われる変数には、「シェル変数」と「環境変数」という2種類の異なるスコープが存在します。この2つの境界線を正確に理解することが、トラブルシューティングや試験対策の第一歩となります。

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 エイリアスを一時的に無効化して実体コマンドを実行する手法
エイリアスが設定されているコマンド(例: rm が rm -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の設定を永続化(再ログイン後も保持)するためには、適切な設定ファイルへ記述する必要があります。シェルが「ログインシェル」として起動したのか、それとも「非ログインシェル」として起動したのかによって、読み込まれるファイルの順序と対象が決定的に異なります。

4.1 ログインシェル(Login Shell)起動時の読み込みフロー
ユーザー認証(SSHログイン、テキストコンソールログイン、またはsu - <user>での切り替え)を経て起動するシェルを「ログインシェル」と呼びます。ログインシェルは以下の厳密な順序で設定ファイルを探索・実行します。
-
ステップ1:システム共通設定ファイル
/etc/profileが最初に実行され、全ユーザー共通の基本環境変数やumaskが設定されます。さらに、この内部から/etc/profile.d/*.shが一括読み込みされます。 -
ステップ2:ユーザー固有設定ファイル(探索優先順位)
ユーザーのホームディレクトリ直下にある以下の3つのファイルのうち、最初に見つかった1つだけを実行し、残りは無視します。
~/.bash_profile(第1候補・Red Hat系等の標準)~/.bash_login(第2候補)~/.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 | env、printenv |
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の順序、export、unset、source、各環境変数のスペルをコマ問でノーミスになるまで演習します。
- 「シェル環境のカスタマイズ」分野(重要度4):
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)、および終了ステータス判定の極意を解説します。
LinuC Level 1 学習シリーズナビゲーション
