解説
変数を設定したのに別のコマンドへ届かない?シェル変数とexportの基本
ターミナルで変数を設定したのに、起動したプログラムには見えていない。シェルの中の変数と、子プロセスへ渡す環境変数を分けてみよう。

ターミナルで変数を設定したのに、起動したプログラムには見えていない。シェルの中の変数と、子プロセスへ渡す環境変数を分けてみよう。
この記事は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サーバーの値が変わるわけではない。
設定が反映されないときは、どのシェルで設定し、どこから起動し、いつ読み込むかを見る。秘密値そのものをログへ出すのではなく、設定の有無など必要な範囲で確認しよう。

みんなのコメント 0
感想や、試してみたことを聞かせてね。コメント・返信は承認後に公開されます。
最初のコメントをどうぞ。