DESIGN / CODE / INFRA / AI

解説

変数を設定したのに別のコマンドへ届かない?シェル変数とexportの基本

ターミナルで変数を設定したのに、起動したプログラムには見えていない。シェルの中の変数と、子プロセスへ渡す環境変数を分けてみよう。

変数を設定したのに別のコマンドへ届かない?シェル変数とexportの基本
保存リストを見る →
この記事の道しるべ 5項目

ターミナルで変数を設定したのに、起動したプログラムには見えていない。シェルの中の変数と、子プロセスへ渡す環境変数を分けてみよう。

この記事はBashの練習。実際の秘密鍵やパスワードは使わず、DEMO_COLORという練習用の名前だけを使う。PATHなど、システムで使う変数は書き換えないよ。

起動元と、そこから始まる処理

シェルはコマンドを実行するプログラム。そこから別のプログラムを起動すると、その処理は子プロセスとして実行される。

シェル内で値を持つことと、子プロセスへ環境の一部として渡すことは別。exportは、指定した変数を、その後に起動する子プロセスへ渡す対象にする仕組みだよ。

練習用の別シェルで確かめる

最初に bash --noprofile --norc を実行して練習用のBashを開く。次をその中で試す。元の環境に同名の変数があっても、この練習先でだけ外すよ。

unset DEMO_COLOR
DEMO_COLOR=blue
bash -c 'printf "%s\n" "${DEMO_COLOR-unset}"'
export DEMO_COLOR
bash -c 'printf "%s\n" "${DEMO_COLOR-unset}"'

最初の子Bashはunset、export後の子Bashはblueと表示する。親にある値が、export前には子へ渡っていない例だよ。ここまでを別のBashプロセスで確認している。

一回のコマンドだけへ渡す方法

DEMO_COLOR=green bash -c 'printf "%s\n" "$DEMO_COLOR"'
printf '%s\n' "$DEMO_COLOR"

一行目の子にはgreenが渡り、二行目の練習元ではblueのまま。この形の代入は、そのコマンドへの環境指定として使える。練習が終わったらexitで別シェルを閉じれば、元の作業へ戻れるよ。

すでに動くプログラムへは後から届かない

環境は通常、プログラムを起動した時点で引き継がれる。別のターミナルでexportしただけで、すでに動いているWebサーバーの値が変わるわけではない。

設定が反映されないときは、どのシェルで設定し、どこから起動し、いつ読み込むかを見る。秘密値そのものをログへ出すのではなく、設定の有無など必要な範囲で確認しよう。

引用符の意味はBashの一重・二重引用符、Composeのファイルは.envとenv_fileへ。

参照した公式資料

確認日:2026年10月24日。

参考・出典

公開と変更の記録
  • :初回公開

日時は日本時間です。記載のある変更は、確認できた編集記録に基づきます。更新日の違いだけから変更内容を推測して載せることはありません。

更新・訂正の方針 →

みんなのコメント 0

感想や、試してみたことを聞かせてね。コメント・返信は承認後に公開されます。

最初のコメントをどうぞ。