Shell環境変数のエクスポートとスコープ制御

Linuxシステムにおいて、ユーザーがログインすると、シェルプロセス(親シェル)が起動します。このシェル内で実行されるコマンドやスクリプトは、通常、そのシェルのコンテキストで動作しますが、明示的にスクリプトを実行した場合、シェルは新しいプロセス(子シェル)を生成してそれを実行します。

子シェルは親シェルから継承された環境の一部を受け取りますが、**ローカルに定義された変数はデフォルトでは子シェルに渡されません**。逆に、exportで明示的にエクスポートされた変数のみが、子プロセスの環境にコピーされて利用可能になります。

以下は、exportによる環境伝搬の具体例です。

例:ファイル処理ワークフローにおける環境変数共有

showlist.sh(親スクリプト):

#!/bin/bash
DATA_SOURCE="inventory.txt"
export DATA_SOURCE
echo "準備中: $DATA_SOURCE"
cat "$DATA_SOURCE" | head -n 5
./printlist.sh

printlist.sh(子スクリプト):

#!/bin/bash
if [[ -n "$DATA_SOURCE" ]]; then
  echo "出力対象: $DATA_SOURCE"
  lp -o landscape "$DATA_SOURCE" > /dev/null 2>&1 &
else
  echo "エラー: DATA_SOURCE が未定義です"
  exit 1
fi

実行結果(想定):

$ ./showlist.sh
準備中: inventory.txt
item001: server-a
item002: db-node
item003: cache-proxy
item004: load-balancer
item005: api-gateway
出力対象: inventory.txt

exportコマンドの基本構文は以下の通りです:

  • export VAR_NAME="value" — 変数を環境に登録
  • export -p — 現在のエクスポート済み変数一覧表示
  • export -n VAR_NAME — エクスポート解除(環境から除外)
  • export -f func_name — 関数を子シェルに渡すためのエクスポート

重要な挙動の要点:

  1. シェルスクリプトはデフォルトで子シェルで実行されるため、親シェルのローカル変数は自動的に継承されない。
  2. export済み変数は、子プロセスのenvに含まれ、getenv()系APIでも参照可能。
  3. 子シェルでexportした変数は、その子シェル終了とともに失われる — 親シェルの環境には一切影響を与えない。
  4. source(または.)でスクリプトを読み込むと、子シェルは生成されず、現在のシェル空間で実行されるため、export不要で変数が即時利用可能になる。

タグ: bash shell-scripting environment-variables linux-cli export-command

7月10日 17:11 投稿