Linux入門:コマンド操作のきほん
環境変数とは
設定した覚えが無いのに、もう効いている値がある
ls と打つと一覧が出ます。ファイルの置き場所を教えた覚えは無いはずです。なぜ動くのかというと、シェルが PATH という値を見て、そこに並んだディレクトリの中から ls を探しているからです。
ターミナル
echo $PATH
# /usr/local/bin:/usr/bin:/binこの PATH が環境変数です。誰かが用意して、あなたのシェルに手渡し、シェルはそれに従って動いている。環境変数とは、プロセスに手渡される設定メモのことだと思ってください。
直書きすると、本番と手元でコードが分かれる
接続先のデータベースや API のキーをコードに書き込むと、手元で動かすときと本番で動かすときで違うコードを持つことになります。書き換え忘れて本番の値のままテストを流す、キーごとリポジトリに残る、といった事故はここから生まれます。
そこで、変わる値はコードの外に出して、起動時に渡します。渡し方は場所によって違いますが、受け取る側はどこでも同じ環境変数です。だからひとつ覚えれば、Docker でも CI でもクラウドでも同じ考え方が通ります。
コード側は「この名前で値が来る」とだけ決めておき、実際の値は動かす場所が用意します。手元では自分のシェルが、本番ではクラウドの設定画面が、同じ名前で違う値を渡す。コードは 1 本のまま、つなぎ先だけが切り替わります。
ターミナル
export DATABASE_URL=postgres://localhost:5432/myapp
echo "$DATABASE_URL"
# postgres://localhost:5432/myappexport を付けた分だけが、子に渡る
シェルで作る変数には 2 種類あります。違いは、そのシェルから起動したプログラムに値が渡るかどうかだけです。
ターミナル
GREETING=hello # このシェルの中だけの値
export DATABASE_URL=... # 起動するプログラムにも渡る値| 種類 | 起動したプログラムに渡るか |
|---|---|
export なし | 渡らない |
export あり | 渡る |
「アプリ側で読めない」という詰まり方の多くがこれです。シェルで値を定義したところまでは合っていて、export が抜けているために、起動したプログラムからは空に見えています。渡すつもりの値かどうかを、定義するときに決めておいてください。
渡るのは下向きだけである点にも注意します。起動したプログラムの中で値を書き換えても、呼び出した側のシェルには戻ってきません。そのシェルを閉じれば、そこで定義した値もまとめて消えます。
本番のキーを手で打ち込むと、そのままコマンド履歴のファイルに平文で残ります。画面を閉じても残るので、鍵の類はファイルから読ませるか、クラウドの保管サービスから取り出す形にしてください。