はじめに
LinuCの勉強をしていると、「シェル変数」と「環境変数」という言葉がよく出てきます。
どちらも「変数」ではあるのですが、exportコマンドを使う・使わないで動作が変わるのがややこしいポイントです。
僕自身、最初は「子プロセスに引き継がれる」と言われてもピンときませんでした。
この記事では、子プロセスの仕組みから、exportの役割までを初心者向けに分かりやすく解説します。
やりたいこと
-
子プロセスとは何かを理解する
-
シェル変数と環境変数の違いを理解する
-
exportコマンドの動きを確認する
シェル変数と環境変数について
シェル変数
特徴:
そのシェル(bash)の中だけで値を保持します。
新しく起動した子プロセスには引き継がれないため、
一時的な値の保存やスクリプト内のローカル変数に向いています。
定義方法:不要(特になし)
環境変数
特徴:
現在のシェルと、そこから起動するプログラムでも使える変数
設定することで、子プロセスにも同じ値を渡すことができます。
PATHやLANGなど、システム全体の動作に関わる設定値も環境変数として管理されています。
定義方法:export
子プロセスとは?
前の説明の中で「子プロセス」とありましたが、まずここを押さえておくと一気に理解が進みます。
Linuxでは、**コマンドを実行するたびに新しいプロセス(=処理の単位)**が作られます。
その中でも、**今のシェル(親)から生まれたプロセスが「子プロセス」**です。
たとえばこんなイメージ👇
つまり、今あなたが使っているbashが「親シェル」、
その中で新しく起動したbash(bashコマンドを打ったとき)が「子シェル=子プロセス」です。
この“親子関係”を確認するには、echo $$(自分のプロセスID)とecho $PPID(親プロセスID)を使います。
もし上でbashを起動して再度実行すると、$$が変わっているはずです。
つまり、新しいプロセス(子)が生まれたということです。
準備するもの
-
Linux環境(UbuntuやWSLでもOK)
-
bashがインストールされていること
コードスクリプト
コードスクリプトの概要
シェル変数と環境変数をそれぞれ作って、
子プロセス(サブシェル)に引き継がれるか確認してみます。
# シェル変数 VAR1="hello" # 環境変数 export VAR2="world" # 現在のシェルで確認 echo $VAR1 echo $VAR2 # サブシェル(子プロセス)を起動 bash # 子プロセス側で確認 echo $VAR1 echo $VAR2 exit
実行結果
$ VAR1="hello" $ export VAR2="world" $ echo $VAR1 hello $ echo $VAR2 world $ bash $ echo $VAR1 $ echo $VAR2 world
コード解説
-
VAR1="hello"→ シェル変数。このbashだけで有効。 -
export VAR2="world"→ 環境変数。子bash(子プロセス)にも引き継がれる。
子bashに入った後でVAR1が消えているのは、親の変数が引き継がれなかったから。
一方でVAR2は残っているので、exportで環境変数化された変数は子プロセスでも使えることが分かります。
注意点
-
exportを使わないと、その変数は親シェル限定。
-
envで環境変数一覧を、setでシェル変数+環境変数一覧を確認できます。
env | grep VAR2 # 環境変数 set | grep VAR1 # シェル変数含む
まとめ
| 種類 | 定義方法 | 有効範囲 | 子プロセスへの引き継ぎ |
|---|---|---|---|
| シェル変数 | VAR=value | 現在のシェル内 | ✕(されない) |
| 環境変数 | export VAR=value | 現在のシェル+子プロセス | 〇(される) |
覚え方は簡単。
-
export = 外(environment)に渡す
-
子プロセス = シェルの子ども(bashの中のbash)
LinuC試験でもよく問われる部分なので、
「子プロセスに引き継がれる=環境変数」と理解しておけばバッチリです。


コメント