環境変数とシェル変数のコマンド/運用演習
同じ設定を子プロセスへ渡す、今回だけ別の値で起動する、現在のシェルへ設定を読み込む、という三つの作業を比較します。表示の予測を先に書き、親と子のどちらで展開された値かを検証します。Bashの実習用セッションを用意してください。
この単元で学ぶこと
- シェル変数と環境変数を区別できる
- 親と子で値が変わる範囲を予測できる
- export・unset・一時代入・PATHを使い分けられる
本文解説
実習の初期状態 unset LESSON_MODEを実行し、printf "<%s>\n" "${LESSON_MODE-unset}"が<unset>を示すことを確認します。過去のexport属性が残っていると単なる代入でも子へ渡るため、初期状態を揃えることが重要です。< >を付けると空文字列と表示忘れを見分けやすくなります。
一回目:親だけに設定 LESSON_MODE=devを実行します。親のprintf "%s\n" "$LESSON_MODE"はdev、bash -c 'printf "%s\n" "${LESSON_MODE-unset}"'はunsetです。親の値が存在することと子の環境へ渡ることは独立した条件です。
二回目:受け渡しを有効にする export LESSON_MODEを実行し、同じ子のコマンドを再実行するとdevです。子が起動時に受け取った値を使います。別のターミナルはこの子ではないため、同じ表示になる保証はありません。
三回目:一時的な上書き LESSON_MODE=test bash -c 'printf "%s\n" "$LESSON_MODE"'はtestです。その直後に親で同じprintfを実行するとdevです。テスト実行だけに条件を渡し、現在の作業環境を変えない用途に使えます。
四回目:属性だけ外す export -n LESSON_MODEを実行すると、親ではdevのままですが新しい子ではunsetへ戻ります。unset LESSON_MODEを実行すると親もunsetになります。変数を空にするLESSON_MODE=を挟んだ場合は、コロンなしの${LESSON_MODE-unset}が空、コロン付きの${LESSON_MODE:-empty}がemptyになります。
設定ファイルの比較 lesson_dir=$(mktemp -d)で専用ディレクトリを作り、printf "export LESSON_MODE=prod\n" > "$lesson_dir/settings.sh"で一行の設定を保存します。unset LESSON_MODEの後にbash "$lesson_dir/settings.sh"を実行しても親は未設定です。. "$lesson_dir/settings.sh"で読み込むと親の値がprodになります。ファイル実行と現在シェルへの読込みの違いを同じ入力で比べます。
先に展開してしまう誤り 親がdev、子へ渡す一時値がtestのとき、LESSON_MODE=test bash -c "printf '%s\n' '$LESSON_MODE'"は外側の二重引用符の中の$LESSON_MODEを親が先にdevへ展開します。子にtestが渡らなかったのではなく、子のコマンド文字列にdevが埋め込まれています。子で変数展開させる式は外側を単一引用符にします。
成功条件と片付け 各段階で親の値、子の値、export -pに現れるかを別々に記録します。値が違う場合は「どのシェルで代入」「どのシェルで展開」「子の起動時に属性があるか」を確認します。最後にunset LESSON_MODE、rm -- "$lesson_dir/settings.sh"、rmdir "$lesson_dir"を実行して実習で作った資源だけを片付けます。
図解
重要ポイント
- exportは値ではなく子へ渡す属性も設定する。
- 環境は親から子へ渡り、子の変更は親へ戻らない。
- export -nは属性、unsetは変数を取り除く。
- PATHは探索先であり現在位置ではない。
- sourceは現在のシェルで実行する。
間違えやすい点
- 子で評価させる式を親の二重引用符で先に展開しない。
- 変数の代入で=の両側に空白を入れない。
- exportだけで再ログイン後にも残ると思わない。
用語解説
- シェル変数
- 現在のシェルが保持する名前付きの値。
- 環境変数
- 外部コマンドなどの子プロセスへ環境として渡す名前と値。
- export属性
- 変数を今後起動する子へ渡すための属性。
- PATH
- コマンド名から実行ファイルを探すディレクトリの列。
- source
- ファイルのコマンドを現在のシェルで実行するBash組込み。
関連教材
参考資料
教材データに登録された参考リンクです。リンク先の内容や更新日は提供元でご確認ください。
確認問題の出題・採点や学習履歴の保存にはログインが必要です。