環境変数

環境変数（かんきょうへんすう、）はオペレーティングシステム (OS) が提供するデータ共有機能の一つ。OS上で動作するタスク（プロセス）がデータを共有するための仕組みである。特にタスクに対して外部からデータを与え、タスクの挙動・設定を変更するために用いる。
概要.
環境変数は、UNIX（互換OSや互換環境も含む）、MS-DOS、Windowsに存在する。
一つの環境変数は、変数名とその値をもち、通常「変数名=値」と表記する。
変数名は英数字とアンダースコアで構成される。
値は一般的にはとくに型や構造は定義されておらず、単なる文字列である（ただし、特定の環境変数は、それを解釈するプログラムによって値の構造が規定されていることがある）。
環境変数は、各プロセスに付随するデータである。一つのプロセスが複数の環境変数をもつことができる。
あるプロセスに付随している環境変数の総体のことを、環境ということがある。
プロセスは、任意に環境変数を参照して、各種の情報を取得したり、動作を変更したりすることができる。
また、プロセスは、自分の環境において、環境変数を新規に作成したり、既存の環境変数の値を変更したり、環境変数を削除したりできる。
環境変数には、システムにより定義されるものとユーザが任意に定義するもの、ほとんどのプログラムに影響を与えるものと特定のプログラムにのみ影響を与えるものがある。
環境は、親プロセスから子プロセスに複製されて継承される。
すなわち、子プロセスで環境を変更しない限り、子プロセスの環境は親プロセスのそれと同一の内容である。
また、子プロセスが自分の環境に対して行った変更は、親プロセスの環境に影響しない。
C言語のプログラムにおいては、main()関数の第3引数（慣習的にenvpという仮引数名である）で環境を参照することができる。ただしこれはISO/ANSIの標準規格で規定されているものではなく、通常はより簡便なgetenv()関数などが使われる。
UNIXの環境変数.
UNIXのシェルコマンドやシェルスクリプトにおいて、環境変数の値は「$環境変数名」という書式で参照する。
環境変数の設定法.
環境変数を設定する方法はシェルにより異なる。
$ VAR=value
$ export VAR
 % setenv VAR value
$ export VAR=value
シェル変数.
UNIXのシェル（UNIX以外の環境に移植されたものも含む）には、シェル変数という概念がある。
環境変数と類似しているが、シェル内で独自に保持しているものであり、シェル以外のプロセスには存在しない。
MS-DOSの環境変数.
MS-DOSのコマンドラインやバッチファイルにおいて、環境変数の値は「%変数名%」という書式で参照する。
環境変数の設定法.
コマンドラインやバッチファイル内で以下のように設定する。
set VAR=value
起動時から有効にするためには、AUTOEXEC.BATに記述する。
環境変数の例.
MS-DOSでは標準的に規定されている環境変数は非常に少ない。
Windowsの環境変数.
環境変数の設定法.
MS-DOSと同様の方法の他、コントロールパネルでも設定することができる。
コントロールパネルで設定したものは、それ以降起動されるプロセスで有効となる。また、再起動後も有効。
コントロールパネルの設定は、システム環境変数とユーザー環境変数に分かれている。
コントロールパネルでシステム環境変数を変更するには、管理者権限が必要。
"path" あるいは "set" コマンドで設定した環境変数は、そのコマンドを実行したプロンプト上、及びそこから起動したプロセス上でしか有効ではないため注意が必要である。
環境変数の例.
Windows NT系の例を示す。Windows 9x系では存在しないものもある。
HTTP環境変数.
ウェブブラウザなどのHTTPユーザーエージェントがサーバにアクセスする際、HTTPリクエストヘッダに各種の情報を含めて送信する。
要求されたリソースがWeb上のプログラム（CGIやPHP、Javaなど）である場合、サーバはHTTPリクエストヘッダの情報や、アクセス元のIPアドレスなどの情報を環境変数に設定してプログラムを起動することが一般的である。
HTTPリクエストヘッダの情報は、ヘッダフィールド名に対応した環境変数で渡される。
これらは、 RFC 3875 The Common Gateway Interface (CGI) Version 1.1の4.1. Request Meta-Variablesで規定されている。PythonやRubyでもこれが参照されている。
この仕組みを指して、俗に「ブラウザが環境変数を吐く」などということがあるが、これは正しい表現ではない。ユーザーエージェントがプログラムに対して環境変数を送っているわけではなく、サーバがプログラムに対して環境変数を設定しているにすぎないためである。
利点.
環境変数は以下の利点を持つ。
利用.
環境変数は様々な用途で利用される。
機密情報の挿入.
環境変数はアプリケーションへ機密情報（Credentials）を渡すために用いられる。
アプリケーションコードはしばしばGit等のバージョン管理ソフトで管理され、レポジトリに登録される。レポジトリに登録されるコードは特定・不特定多数に見られることを前提としているが、機密情報はむしろそれを避ける必要がある。ゆえにコードと機密情報を分離し、コードの実行時に機密情報を渡す仕組みが必要になる。
機密情報を渡す方法の1つは、バージョン管理から除外された設定ファイルである。プログラム実行時の引数としてこの設定ファイルを渡すことで機密情報を利用できるが、設定ファイルはコードと同じ「ファイル」であり、レポジトリへ誤ってコミットされ機密情報が暴露されるリスクがある。
アプリケーション外からのデータ挿入において、環境変数がもつ単純さ・言語非依存性・OS間可搬性は大きなメリットを持つ。また環境変数はファイルでないため誤コミットのリスクは小さい。そのため特にクラウドネイティブアプリケーションのベストプラクティスとして、機密情報の挿入に環境変数が用いられる。