現在のBashで次の2行を実行したところ、結果は <> となった。
LAB_COLORの値を変更せず、2行目の再実行時に <blue> と表示させたい。
LAB_COLOR=blue
bash -c 'printf "<%s>\n" "$LAB_COLOR"'2行の間に追加するコマンドはどれか。
シェル変数は自動では子プロセスへ継承されません。exportで環境へ公開すると、後から起動した子Bashが値を参照できます。
詳細解説
export LAB_COLORexportにより、現在のシェル変数が以後起動する子プロセスの環境へ渡されます。
正しい選択肢です。LAB_COLOR=blueによって値はすでに設定されています。export LAB_COLORはその値を変更せず、LAB_COLORにexport属性を付けます。
export後に起動したbash -cは、親Bashから渡された環境の中にLAB_COLOR=blueを見つけられます。値の設定とexportを同時に行う場合は、export LAB_COLOR=blueとも書けます。
export LAB_COLOR
declare -p LAB_COLORdeclare -x LAB_COLOR="blue"set LAB_COLORこの指定では位置パラメータを設定するだけで、LAB_COLORにexport属性は付きません。
誤りです。Bashのsetは、シェルオプションや位置パラメータを扱う組み込みコマンドです。set LAB_COLORを実行すると、文字列LAB_COLORが位置パラメータ$1に設定されます。
もともとのシェル変数LAB_COLOR=blueは残りますが、export属性は付きません。そのため、続けて起動するbash -cの環境にはLAB_COLORが含まれません。変数代入、位置パラメータの設定、環境への公開を区別する必要があります。
set LAB_COLOR
printf 'LAB_COLOR=<%s> / $1=<%s>\n' "$LAB_COLOR" "$1"LAB_COLOR=<blue> / $1=<LAB_COLOR>echo "$LAB_COLOR"現在のシェルで値を表示するだけで、子プロセスへ変数を渡す効果はありません。
誤りです。echoは、現在のシェルが展開した$LAB_COLORの値を標準出力へ表示するだけです。現在のBashではblueが見えているため、表示自体は成功します。
しかし、表示しても変数の属性や子プロセスの環境は変化しません。「親シェルから値が見えること」と「子プロセスへ値が渡ること」は別です。
echo "$LAB_COLOR"
bash -c 'printf "<%s>\n" "$LAB_COLOR"'blue
<>unset LAB_COLOR変数自体を削除するため、現在のシェルでも子シェルでも値を参照できなくなります。
誤りです。unset LAB_COLORは、現在のシェルから変数そのものを削除します。環境へ公開するのとは反対の操作です。
削除後は現在のシェルでも値が空になり、その後に起動する子Bashにも渡せる値がありません。
unset LAB_COLOR
printf '<%s>\n' "$LAB_COLOR"<>実際に確かめる
一時的な検証環境で実行できる例です。
unset LAB_COLOR
LAB_COLOR=blue
bash -c 'printf "before=<%s>\n" "$LAB_COLOR"'
export LAB_COLOR
bash -c 'printf "after=<%s>\n" "$LAB_COLOR"'期待される結果
before=<>
after=<blue>理解のポイント
- シェル変数と環境変数の違い
- 子プロセスへの値の継承
- シングルクォート内の展開タイミング
確認時の注意
- 確認環境:
- declare -pの表示がdeclare --からdeclare -xへ変わる点を確認します。
- 最初の子Bashは空、export後に起動した子Bashはblueを表示します。
基礎のおさらい
シェル変数と環境変数
LAB_COLOR=blueだけなら、値は現在のBashが持つシェル変数です。exportすると、そのシェルから起動する子プロセスへ渡す環境にも同じ名前と値が含まれます。
未export: 親Bash LAB_COLOR=blue → 子Bash LAB_COLORなし
export済み: 親Bash LAB_COLOR=blue → 子Bash LAB_COLOR=blueexportは値を変更しない
export LAB_COLORはblueという値を設定する操作ではありません。すでに存在する変数に、子プロセスの環境へ含める属性を付けます。
declare -p LAB_COLOR
# 未exportは declare --、export後は declare -x継承は親から子への一方向
子プロセスは起動時に環境を受け取ります。子側で値を変更しても、通常は親Bashの変数へ逆向きに反映されません。
引用符と展開のタイミング
bash -cへ渡す文字列をシングルクォートで囲むと、外側のBashでは$LAB_COLORを展開しません。新しく起動したBashが、自分の環境から値を探して展開します。