環境変数を理解する

同じ端末では読めた変数が、起動したプログラムからは見えないことがあります。変数の値とexport属性を分け、親から子への受け渡しと、子から親へ戻らない性質を実際の出力で確かめます。Bashを使い、各例の開始時に示す前提を守ります。

この単元で学ぶこと

  • シェル変数と環境変数を区別できる
  • 親と子で値が変わる範囲を予測できる
  • export・unset・一時代入・PATHを使い分けられる

本文解説

シェルの中に値を置く 変数は名前で値を参照するための入れ物です。LESSON_COLOR=blueは現在のシェルに値を設定します。代入の=の前後には空白を入れません。printf "%s\n" "$LESSON_COLOR"ならblueを表示します。シェル変数を作っただけで、すべての外部プログラムにその値が渡るわけではありません。

子へ渡す属性 export LESSON_COLORを実行すると、その変数を今後起動する子プロセスの環境へ含めます。export LESSON_COLOR=blueのように代入と属性設定を一度に行うこともできます。環境変数は名前と値の組で受け渡されます。別のターミナルや既に起動済みのプログラムの環境が同時に書き換わるわけではありません。

未exportとexportを比較する unset LESSON_COLORで以前の値と属性を取り除き、LESSON_COLOR=blueと設定します。bash -c 'printf "%s\n" "${LESSON_COLOR-unset}"'はunsetを表示します。続いてexport LESSON_COLORを実行して同じコマンドを起動するとblueです。単一引用符で子へ式を渡すため、変数展開は親ではなく子のBashで起きます。

子の変更は親へ戻らない 親でexport LESSON_COLOR=blueを設定し、bash -c 'LESSON_COLOR=red; printf "%s\n" "$LESSON_COLOR"'を実行すると子はredを表示します。終了後に親でprintf "%s\n" "$LESSON_COLOR"を実行するとblueです。子が受け取った環境を変更しても、親の記憶領域へ値を書き戻す仕組みにはなりません。

一回だけ設定する LESSON_COLOR=green bash -c 'printf "%s\n" "$LESSON_COLOR"'なら、その外部コマンドを起動する環境にgreenを渡します。元の親がblueなら起動後もblueです。コマンドの前の一時代入は、シェルでLESSON_COLOR=greenだけを実行して永続的に変える操作とは違います。

exportを外す、値を消す export -n LESSON_COLORはBashでexport属性を外しますが、現在のシェルの値は残します。unset LESSON_COLORは変数そのものを取り除きます。空文字列を設定したLESSON_COLOR=と、未設定は同じではありません。${LESSON_COLOR-unset}は未設定だけを、${LESSON_COLOR:-empty}は未設定または空を代替表示します。

PATHはコマンド探索の順番 PATHはスラッシュを含まない外部コマンド名を探すディレクトリの列です。Linuxではコロンで区切り、先に見つかった実行可能ファイルが候補になります。PATHを変更しても現在のディレクトリは変わりません。/usr/bin/toolのようにスラッシュを含むパス指定はPATH探索とは別です。実際に何が選ばれるかはtype -aやcommand -vで確認し、関数・組込み・キャッシュの影響も区別します。

設定ファイルを実行する場所 bash settings.shは子のBashでファイルを実行します。そこでexportしても親のシェルには戻りません。. ./settings.shまたはsource ./settings.shは現在のシェルで読み込むため、その後の現在シェルに設定が残ります。ファイルのコマンド自体も現在シェルで実行されるので、単なるデータの読込みではありません。

実習と成功条件 新しいBashの実習用セッションでunset LESSON_COLORから開始します。未exportの子でunset、export後の子でblue、一時代入した子でgreen、その後の親でblueという四つの表示を順に確認します。親の値はtest "$LESSON_COLOR" = blueの直後の終了状態0でも検証できます。結果が違えばexport -pで属性を確認し、子の式を二重引用符で囲んで親に先に展開させていないか調べます。終了時はunset LESSON_COLORを実行して実習用セッションを閉じます。

永続化との区別 exportは現在のシェルと今後の子への受け渡しであり、再ログイン後まで保存する指示ではありません。永続的な設定は起動の種類に適した初期化ファイルへ記載します。対話・非対話、ログイン・非ログインで読まれるファイルが違うため、単に.bashrcへ書けばすべてのサービスで有効になるとは考えません。

図解

環境を受け取る方向
子への一時代入も親の値を変えない。現在のシェルを変えるsourceとは区別する。

重要ポイント

  • exportは値ではなく子へ渡す属性も設定する。
  • 環境は親から子へ渡り、子の変更は親へ戻らない。
  • export -nは属性、unsetは変数を取り除く。
  • PATHは探索先であり現在位置ではない。
  • sourceは現在のシェルで実行する。

間違えやすい点

  • 子で評価させる式を親の二重引用符で先に展開しない。
  • 変数の代入で=の両側に空白を入れない。
  • exportだけで再ログイン後にも残ると思わない。

用語解説

シェル変数
現在のシェルが保持する名前付きの値。
環境変数
外部コマンドなどの子プロセスへ環境として渡す名前と値。
export属性
変数を今後起動する子へ渡すための属性。
PATH
コマンド名から実行ファイルを探すディレクトリの列。
source
ファイルのコマンドを現在のシェルで実行するBash組込み。

関連教材

参考資料

教材データに登録された参考リンクです。リンク先の内容や更新日は提供元でご確認ください。

確認問題の出題・採点や学習履歴の保存にはログインが必要です。