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