環境変数(かんきょうへんすう、英語: environment variable)はオペレーティングシステム (OS) が提供するデータ共有機能の一つ。OS上で動作するタスク(プロセス)がデータを共有するための仕組みである。特にタスクに対して外部からデータを与え、タスクの挙動・設定を変更するために用いる。

概要

環境変数は、UNIX(互換OSや互換環境も含む)、MS-DOS、Windowsに存在する。

一つの環境変数は、変数名とその値をもち、通常「変数名=値」と表記する。 変数名は英数字とアンダースコアで構成される。 一般的に、値は特にデータ型や構造は定義されておらず、単なる文字列である(ただし、特定の環境変数は、それを解釈するプログラムによって値の構造が規定されていることがある)。

環境変数は、各プロセスに付随するデータである。一つのプロセスが複数の環境変数をもつことができる。 あるプロセスに付随している環境変数の総体のことを、環境ということがある。 プロセスは、任意に環境変数を参照して、各種の情報を取得したり、動作を変更したりすることができる。 また、プロセスは、自分の環境において、環境変数を新規に作成したり、既存の環境変数の値を変更したり、環境変数を削除したりできる。

環境変数には、システムにより定義されるものとユーザが任意に定義するもの、ほとんどのプログラムに影響を与えるものと特定のプログラムにのみ影響を与えるものがある。

環境は、親プロセスから子プロセスに複製されて継承される。 すなわち、子プロセスで環境を変更しない限り、子プロセスの環境は親プロセスのそれと同一の内容である。 また、子プロセスが自分の環境に対して行った変更は、親プロセスの環境に影響しない。

C言語においては、ANSI(ANSI C、C89)およびISO(ISO C、C90以降)の標準規格によって共通拡張 (common extensions) 機能[1][2]が規定されており、ホスト環境 (hosted environment) ではmain()関数の第3引数char *envp[]で環境を参照することができる。コマンドライン引数を表す第2引数char *argv[]と似ているが、対となる第1引数int argcに相当するものはなく、独立したヌル終端のポインタ配列となっている。ただしこの共通拡張は、多くのシステムで広く使われているものの、すべての実装に対してポータブル(移植可能)とは限らない。通常はより簡便な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[3]やRuby[4]でもこれが参照されている。

HTTP環境変数で利用される主な情報
情報 リクエストヘッダ 環境変数
クライアントのIPアドレス なし REMOTE_ADDR
クライアントの逆引きホスト名 なし REMOTE_HOST
クライアントのTCPポート番号 なし REMOTE_PORT
ユーザーエージェントが受理するMIMEメディアタイプ Accept: HTTP_ACCEPT
ユーザーエージェントが受理する文字コード Accept-Charset: HTTP_ACCEPT_CHARSET
ユーザーエージェントが受理する言語 Accept-Language: HTTP_ACCEPT_LANGUAGE
サーバのホスト名 Host: HTTP_HOST
ユーザーエージェントのリファラー Referer: HTTP_REFERER
ユーザーエージェントの名称 User-Agent: HTTP_USER_AGENT

この仕組みを指して、俗に「ブラウザが環境変数を吐く」などということがあるが、これは正しい表現ではない。ユーザーエージェントがプログラムに対して環境変数を送っているわけではなく、サーバがプログラムに対して環境変数を設定しているにすぎないためである。

利点

環境変数は以下の利点を持つ。

利用

環境変数は様々な用途で利用される。

機密情報の挿入

環境変数はアプリケーションへ機密情報(Credentials)を渡すために用いられる。

アプリケーションコードはしばしばGit等のバージョン管理ソフトで管理され、レポジトリに登録される。レポジトリに登録されるコードは特定・不特定多数に見られることを前提としているが、機密情報はむしろそれを避ける必要がある。ゆえにコードと機密情報を分離し、コードの実行時に機密情報を渡す仕組みが必要になる。

機密情報を渡す方法の1つは、バージョン管理から除外された設定ファイルである[5]。プログラム実行時の引数としてこの設定ファイルを渡すことで機密情報を利用できるが、設定ファイルはコードと同じ「ファイル」であり、レポジトリへ誤ってコミットされ機密情報が暴露されるリスクがある。

アプリケーション外からのデータ挿入において、環境変数がもつ単純さ・言語非依存性・OS間可搬性は大きなメリットを持つ[6]。また環境変数はファイルでないため誤コミットのリスクは小さい[7]。そのため特にクラウドネイティブアプリケーションのベストプラクティスとして、機密情報の挿入に環境変数が用いられる[8]。

脚注

[脚注の使い方]
  1. ↑ Federal Information Processing Standards Publication: for information systems - programming language - C (ANSI X3.159-1989, §F.5.1 Environment Arguments) | NIST Technical Series Publications, 連邦情報処理標準
  2. ↑ for Programming Languages - C (ISO/IEC 9899:1990, §G.5.1 Environment arguments), Internet Archive
  3. ↑ J. Eby, Phillip (2003年11月7日). “PEP 333 -- Python Web Server Gateway Interface v1.0” (英語). Python.org. 2017年3月26日閲覧。
  4. ↑ “File: SPEC — Documentation for rack/rack (master)” (英語). 2017年3月26日閲覧。
  5. ↑ 設定に対するもう1つのアプローチは、バージョン管理システムにチェックインされない設定ファイルを使う方法である。 The Twelve-Factor App - III. 設定
  6. ↑ 独自形式の設定ファイルやJava System Propertiesなど他の設定の仕組みとは異なり、環境変数は言語やOSに依存しない標準である。 The Twelve-Factor App
  7. ↑ 設定ファイルとは異なり、誤ってリポジトリにチェックインされる可能性はほとんどない。 The Twelve-Factor App
  8. ↑ 設定には以下のものが含まれる。 ... 外部サービスの認証情報 ... Twelve-Factor Appは設定を 環境変数 に格納する。 The Twelve-Factor App - III. 設定
⌬ Phoenix Mesh CID: 未登録 IPFS未登録 📡 0ピア N=1 CRITICAL PQS B71