環境変数の確認と設定
このレッスンで分かること
- 確認は
env/printenv、設定はexport、削除はunset- その実行限定なら
VAR=値 コマンドの形で渡せます- 未定義時のデフォルトは
${VAR:-デフォルト}、必須チェックは${VAR:?エラー}
環境変数の確認と設定 とは
環境変数の確認・設定方法を学びます。設定の応用や注意点も解説。本レッスンでは、環境変数の確認と設定 の基本から実際の使いどころまでを整理し、現場で迷わず使える形に落とし込みます。
なぜ重要か
環境変数は「正しい値が入っているか」を確認できないとデバッグが進みません。たとえば本番だけアプリが落ちる、特定の CI ランナーだけテストが通らない、Docker コンテナ内で API キーが空、こうしたトラブルは現場で日常的に起こります。原因の 8 割は環境変数の設定ミスか展開ミスです。本レッスンでは env printenv export unset set の役割を整理し、サブシェル内で実際に変数を作って消す手触りを身につけます。
プロダクション環境のデバッグでは、ログから読み取れる情報が限られるため、シェル上で素早く printenv を叩き、想定どおりの値が読み込まれているか確認するスキルが命綱になります。リモート環境に SSH した直後にまず叩くのは、たいていこのカテゴリのコマンドです。
コマンド早見表
| コマンド | 役割 |
|---|---|
env | 環境変数を一覧表示。引数なしで全件、引数ありで一時的に環境を変えてコマンドを実行 |
printenv | 環境変数の値を表示。printenv 名前 で個別、引数なしで一覧 |
export | シェル変数を環境変数化、または新規に環境変数を定義 |
unset | 変数を削除。シェル変数 / 環境変数の両方に効く |
set | シェル変数を含むすべての変数と関数を一覧表示 |
declare -x | 環境変数として宣言。-r を付ければ読み取り専用 |
図解 ライフサイクル
図の流れを順序リストで書き直すと、次の通りです。
FOO=barで変数を定義するexport付きなら環境変数、なしならシェル変数- シェル変数は親シェルの中だけで生きる
- 環境変数は子プロセスへ継承される
- どちらも
unsetで削除できる
代表例
値の設定と確認は次のとおりです。
ターミナル
# 一時定義
GREETING=hello
echo $GREETING
# hello
# 環境変数化して子プロセスへ渡す
export GREETING
bash -c 'echo $GREETING'
# hello
# その場限りで子プロセスにだけ値を渡す
FOO=bar bash -c 'echo $FOO'
# bar
# 削除
unset GREETINGenv を使うと「今だけ環境変数を上書きしてコマンドを動かす」ことができます。デバッグや本番との差分確認で重宝します。
ターミナル
env NODE_ENV=production node -e 'console.log(process.env.NODE_ENV)'
# production部分一覧表示
環境変数を 1 つだけ確認したい場合、grep でフィルタするのが王道です。
ターミナル
printenv | grep -i path
# PATH=/usr/local/sbin:/usr/local/bin:/usr/bin
env | grep -E '^(NODE|API)'
# NODE_ENV=production
# API_KEY=xxxデフォルト値の指定
シェルの変数展開には未定義時にデフォルトを返す書き方があり、起動スクリプトで多用します。
ターミナル
echo ${PORT:-3000}
# PORT が未定義なら 3000 を表示
PORT=8080
echo ${PORT:-3000}
# PORT が定義済みなら 8080 を表示
echo ${REQUIRED_VAR:?REQUIRED_VAR is not set}
# 未定義ならエラーメッセージを出して終了値の長さや存在チェック
シェルスクリプトの先頭で「環境変数が空でないか」を確認するパターンも頻出です。
ターミナル
if [ -z "$API_KEY" ]; then
echo "API_KEY is empty" >&2
exit 1
fi
if [ -n "$DEBUG" ]; then
echo "DEBUG mode"
fi-z は空文字なら真、-n は空文字でないなら真です。本番運用するスクリプトでは、こうしたガード節を入れて事故を防ぎます。
クォートの基本
環境変数の中にスペースが入る場合、ダブルクオートで囲むのが鉄則です。クオートを忘れると単語分割されてバグの原因になります。
ターミナル
NAME="alice smith"
echo $NAME # alice smith (分割されたあとに表示)
echo "$NAME" # alice smith (1 つの引数として渡る)
ls "$DIR" # DIR に空白があっても安全よくある落とし穴
=の前後に空白を入れるとシェルは別のコマンドとして解釈し、command not foundになります。FOO = barは NG、FOO=barが正解です。
親シェルで
exportした値は、シェルを閉じると消えます。永続化したい場合は~/.bashrcなどの設定ファイルに書く必要があります。次のレッスンで扱います。
やってみよう
コース UI のエディタで、MESSAGE という環境変数に好きな文字列を入れて、サブシェルから読み取ってみてください。
ここまでの要点
確認は env / printenv、設定は export、削除は unset。FOO=bar コマンド でその場限り。デフォルト値は ${VAR:-値}、必須は ${VAR:?エラー}。
まとめ
envprintenvで現在のプロセスに渡っている環境変数を確認できるexportでシェル変数を環境変数に昇格させ、子プロセスへ継承させるVAR=値 コマンドの形でその実行に限った環境変数を渡せるunsetで変数を削除し、setでシェル変数も含めた全変数を確認できる- 空白や引用符の扱いを間違えると意図しない挙動になるため、定義時は慎重に書く
${VAR:-デフォルト}で未定義時の値を補えるため、起動スクリプトで頻出する書き方
次のレッスン
次は シェル設定ファイル で、~/.bashrc などに環境変数を書いて永続化する方法を学びます。
事前確認 — 進む前に次の 3 つができることを確認しましょう。
- env と export の要点を自分の言葉で説明できる
- このレッスンの最小コード (または操作手順) を見ずに書ける
- 練習問題やクイズで間違えた箇所を読み直して理解した
理解度チェック (30 秒)
Q. env と export とは何か、1 文で説明してください。
A. 本文の「このレッスンで分かること」または冒頭の説明文を見直し、自分の言葉で要約できれば OK。詰まったら本レッスンの最初の H2 セクションを読み返してみましょう。
関連レッスン
課題
- export を使って MESSAGE を定義する
- bash -c でサブシェルを起動し、その中で echo $MESSAGE を実行する