はじめに
環境変数を .env ファイルに書くとき、キーは大文字にするべき?それとも小文字でも問題ない?
この記事では、そんな素朴な疑問を言語別の挙動と共に解説します。
読み終えると「大文字にすべき理由」と「小文字を許容するケース」が明確に分かり、チームで迷うことがなくなります。
前提知識
- OS(Linux / macOS / Windows)で環境変数を扱った経験
.envファイルを使ったことがある(dotenv 等)- 最低限の Node.js または Python の基礎文法
そもそも環境変数のキーに大文字小文字は関係あるの?
POSIX 環境のルール
POSIX 仕様上、環境変数名は 「大文字・小文字・アンダースコア」 のみ使用可能で、大文字小文字を区別する ため、
FOO と foo は別物として扱われます。
しかし、これは「区別される」という仕様であって、「小文字を使うべきではない」という制限ではありません。
慣習の形成
Unix 系のシェルでは大文字が圧倒的に多く、小文字は「ローカル変数」として関数内部で使われることが多いです。
この慣習が「環境変数=大文字」という文化を生み出しました。
言語別:小文字キーはどう扱われる?
Node.js (dotenv)
Js// .env api_key=sk-123 API_KEY=sk-456 // index.js require('dotenv').config(); console.log(process.env.api_key); // → sk-123 console.log(process.env.API_KEY); // → sk-456
dotenv は ファイルに書かれた通りのキー を process.env にセットします。
大文字小文字は区別されるため、混在させると混乱の元になります。
Python (python-dotenv)
Python# .env db_host=localhost DB_HOST=127.0.0.1 # main.py from dotenv import load_dotenv import os load_dotenv() print(os.getenv("db_host")) # → localhost print(os.getenv("DB_HOST")) # → 127.0.0.1
Node.js と同様、キーは厳密に区別されます。
PEP 8 では定数(環境変数も含む)を大文字とするよう推奨しているため、小文字は推奨されません。
Docker / docker-compose.yml
Yamlenvironment: - apiKey=value # 小文字でも通る - API_KEY=value # 大文字
Docker 側は文字列をそのままコンテナに渡すだけなので、キーのケースは問いません。
ただし、実行時に参照するアプリケーション側のルールに従う必要があります。
Windows (Command Prompt)
> set apiKey=123
> echo %apiKey%
123
Windows のコマンドプロンプトでも小文字は有効ですが、PowerShell では
$Env:apiKey のように大文字小文字を区別するため、統一感が失われます。
小文字を使うとどんな弊害がある?
- レビューで指摘される
「なんで小文字?」という会議が増え、本質的な議論から逸れる - CI/CD での不整合
シェルスクリプト側は大文字、コード側は小文字、というミスマッチが起きやすい - OS 移行時の落とし穴
macOS → Linux へ移行した際に、環境変数が見えなくなる(実例あり) - ドキュメントの一貫性が崩れる
README では大文字、コードでは小文字、という齟齬が生じる
ベストプラクティス:チームで迷わないルール
| 項目 | 推奨事項 |
|---|---|
| キー名 | すべて大文字 + アンダースコア区切り(SNAKE_CASE) |
| 値 | 引用符で囲わない(空白を含む場合はダブルクォート) |
| ファイル名 | .env(先頭ドット固定) |
| サンプル | .env.example を同梱し、キーだけを記載 |
| 禁止 | 小文字、キャメルケース、ハイフン区切り |
自動化スニペット
Node.js + ESLint
Bashnpm install eslint-plugin-node
Json// .eslintrc.json { "rules": { "node/no-process-env": ["error", { "allow": ["NODE_ENV", "PORT"] }] } }
Python + pre-commit
Yaml# .pre-commit-config.yaml repos: - repo: https://github.com/pycqa/flake8 rev: 6.0.0 hooks: - id: flake8 args: [--select=E701] # 定数の小文字検出
小文字を許容する唯一のケース
既存の SaaS やクライアントライブラリが キャメルケースを要求してくる場合 のみです。
例:
- Firebase Admin SDK が databaseURL を要求
- Stripe Node.js SDK が apiVersion を要求
この場合は「ライブラリ側の仕様に従う」ことを優先し、チーム内で明示的にコメントを残しましょう。
まとめ
- POSIX 上、小文字は文法的に正しいが、慣習上大文字が強く推奨される
- 言語・ランタイム問わず小文字キーは区別され、混在は混乱の元
- チーム開発では「すべて大文字+アンダースコア区切り」をルール化して自動検査するのが最善
- 唯一、外部ライブラリがキャメルケースを要求する場合のみ小文字を許容する
大文字小文字のケアレスミスでデバッグの時間を無駄にしないよう、
今日から .env を見直してみてください。
次回は「環境変数の優先順位(システム環境変数 vs ファイル vs コード)」を深掘りします。
