環境変数

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

 概要 
環境変数は、UNIX（Unix系も含む）、DOS、Windowsに存在する。

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

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

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

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

C言語においては、ANSI（ANSI C、C89）およびISO（ISO C、C90以降）の標準規格によって共通拡張 (common extensions) 機能Federal Information Processing Standards Publication: for information systems - programming language - C (ANSI X3.159-1989, §F.5.1 Environment Arguments) | NIST Technical Series Publications, 連邦情報処理標準for Programming Languages - C (ISO/IEC 9899:1990, §G.5.1 Environment arguments), Internet Archiveが規定されており、ホスト環境 (hosted environment) ではmain()関数の第3引数で環境を参照することができる。コマンドライン引数を表す第2引数と似ているが、対となる第1引数に相当するものはなく、独立したヌル終端のポインタ配列となっている。ただしこの共通拡張は、多くのシステムで広く使われているものの、すべての実装に対してポータブル（移植可能）とは限らない。通常はより簡便なgetenv()関数などが使われる。

 UNIXの環境変数 
UNIXのシェルコマンドやシェルスクリプトにおいて、環境変数の値は「$環境変数名」という書式で参照する。

 環境変数の設定法 
環境変数を設定する方法はシェルにより異なる。

shの場合
$ VAR=value
$ export VAR
cshの場合
 % setenv VAR value
bashの場合
$ export VAR=value

 環境変数の例 

 EDITOR: エディタのコマンド名を指定する。エディタを起動するプログラム（mail、lessなど）で参照される。
 HOME: ホームディレクトリを指定する。cdコマンドで引数を指定しない場合、このディレクトリに移動する。例: /home/$USER
 LANG: ロケールを指定する。日本語ロケールの場合はjaまたはja_JPなどを指定する。setlocale()関数の呼び出しにより有効となる。
 LESSCHARSET: lessの入力・出力文字コードを指定する。
 MAIL: メールボックスのパス名を指定する。例: /var/mail/$USER, /usr/spool/mail/$USER
 NAME: ユーザの名前を指定する。メール送信時などに使われる。
 PAGER: ページャ（more、less、pgなど）を指定する。ページャを起動するプログラム（manなど）で使われる。
 PATH: コマンド検索パスをコロンで区切って指定する。シェルが参照する。
 PWD: カレントディレクトリが設定される。シェルスクリプトでpwdコマンドの代わりに$PWDを参照することがある。
 SHELL: 現在のシェルの起動パスが設定される。シェルを確認するのに利用できる。例: /bin/sh
 TERM: 端末種別が設定される。この値をキーとしてtermcap/terminfoデータベースが検索される。例: vt100
 TERMCAP: termcapデータベースファイルのパス、あるいは検索されたデータベースエントリの内容が設定される。例: /etc/termcap
 TERMINFO: terminfoデータベースディレクトリのパスが設定される。例: /usr/share/misc/terminfo
 TZ: タイムゾーン情報を指定する。標準Cライブラリの日時関連の関数で参照される。例: JST-9
 USER: ログイン名が設定される。
 VISUAL: スクリーンエディタのコマンド名を指定する。EDITORと同様。

 シェル変数 
UNIXのシェル（UNIX以外の環境に移植されたものも含む）には、シェル変数という概念がある。
環境変数と類似しているが、シェル内で独自に保持しているものであり、シェル以外のプロセスには存在しない。

 DOSの環境変数 
DOSのコマンドラインやバッチファイルにおいて、環境変数の値は「%変数名%」という書式で参照する。

 環境変数の設定法 
コマンドラインやバッチファイル内で以下のように設定する。
set VAR=value

起動時から有効にするためには、AUTOEXEC.BATに記述する。

 環境変数の例 
DOSでは標準的に規定されている環境変数は非常に少ない。

 COMSPEC: シェル (COMMAND.COM) のパス名が設定される。CONFIG.SYSのSHELL=行の記述が反映される。例: C:\COMMAND.COM
 INCLUDE: Cのヘッダファイルのパスを指定する。MS-Cなどが参照する。
 LIB: Cのライブラリファイルのパスを指定する。MS-Cなどが参照する。
 PATH: コマンド検索パスをセミコロンで区切って指定する。シェルが参照する。
 PROMPT: コマンドプロンプトの形式を指定する。例: $p$g
 TEMP: 一時ファイルを置くディレクトリを指定する。ソフトウェアによってはTMPを参照することもある。例: C:\TEMP

 Windowsの環境変数 
 環境変数の設定法 
DOSと同様の方法の他、コントロールパネルでも設定することができる。
コントロールパネルで設定したものは、それ以降起動されるプロセスで有効となる。また、再起動後も有効。

コントロールパネルの設定は、システム環境変数とユーザー環境変数に分かれている。
コントロールパネルでシステム環境変数を変更するには、管理者権限が必要。

"path" あるいは "set" コマンドで設定した環境変数は、そのコマンドを実行したプロンプト（コマンドラインシェル）上、およびそこから起動したプロセス上でしか有効ではないため注意が必要である。

 環境変数の例 
Windows NT系の例を示す。Windows 9x系では存在しないものもある。

 COPYCMD: COPYコマンドのスイッチを指定する。
 COMPUTERNAME: コンピュータ名が設定されている
 CPU, NUMBER_OF_PROCESSORS, PROCESSOR_ARCHITECTURE, PROCESSOR_IDENTIFIER, PROCESSOR_LEVEL, PROCESSOR_REVISION: コンピュータのプロセッサに関する情報が設定されている。
 DIRCMD: DIRコマンドのスイッチを指定する。
 HOMEDRIVE: ホームフォルダのドライブ名が設定されている。例: C:
 HOMEPATH: ホームフォルダのパス名が設定されている。例: \Documents and Settings\%USERNAME%
 OS: OSの種類が設定されている。例: Windows_NT
 PATH: DOSと同じ。
 PATHEXT: 実行可能ファイルの拡張子をコロンで区切って指定する。例: .COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH
 PROMPT: DOSと同じ。
 ProgramFiles: Program Filesフォルダのパス名が設定されている。例: C:\Program Files
 SystemDrive: システムドライブ名が設定されている。例: C:
 SystemRoot: Windowsフォルダのパス名が設定されている。例: C:\WINDOWS
 USERDOMAIN: 現在のユーザのログオンドメインが設定されている。ドメインのない環境ではローカルコンピュータにログオンするためCOMPUTERNAMEと同じになる。
 USERNAME: 現在のユーザのユーザ名が設定されている。
 USERPROFILE: 現在のユーザのユーザプロファイルフォルダのパス名が設定されている。例: C:\Documents and Settings\%USERNAME%
 TEMP: DOSと同じ。例: C:\Documents and Settings\%USERNAME%\Local Settings\Temp
 WINDIR: Windowsフォルダのパス名が設定されている。例: C:\WINDOWS

 HTTP環境変数 
ウェブブラウザなどのHTTPユーザーエージェントがサーバにアクセスする際、HTTPリクエストヘッダに各種の情報を含めて送信する。
要求されたリソースがWeb上のプログラム（CGIやPHP、Javaなど）である場合、サーバはHTTPリクエストヘッダの情報や、アクセス元のIPアドレスなどの情報を環境変数に設定してプログラムを起動することが一般的である。
HTTPリクエストヘッダの情報は、ヘッダフィールド名に対応した環境変数で渡される。

これらは、  The Common Gateway Interface (CGI) Version 1.1の4.1. Request Meta-Variablesで規定されている。PythonやRubyでもこれが参照されている。

+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

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

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

 OSレベルでの事実上の標準機能である
 Linux・macOS・Windows・Androidなどに存在する
 ほぼすべてのプログラミング言語からアクセス可能
 アプリケーションソフトウェアの記述言語に依存しない
 OSレベルのサポートであり、アプリケーションの開発に使用されるプログラミング言語を問わず利用可能
 単純である
 アプリケーション外にKey-Valueペアで存在する変数、というシンプルな機能
 Key・Valueともに文字列であり、数値表現に使われる整数型や浮動小数点数型などの型情報を持たない

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

 機密情報の挿入 

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

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

機密情報を渡す方法の1つは、バージョン管理から除外された設定ファイルである設定に対するもう1つのアプローチは、バージョン管理システムにチェックインされない設定ファイルを使う方法である。 The Twelve-Factor App - III. 設定。プログラム実行時の引数としてこの設定ファイルを渡すことで機密情報を利用できるが、設定ファイルはコードと同じ「ファイル」であり、レポジトリへ誤ってコミットされ機密情報が暴露されるリスクがある。

アプリケーション外からのデータ挿入において、環境変数がもつ単純さ・言語非依存性・OS間可搬性は大きなメリットを持つ独自形式の設定ファイルやJava System Propertiesなど他の設定の仕組みとは異なり、環境変数は言語やOSに依存しない標準である。 The Twelve-Factor App。また環境変数はファイルでないため誤コミットのリスクは小さい設定ファイルとは異なり、誤ってリポジトリにチェックインされる可能性はほとんどない。 The Twelve-Factor App。そのため特にクラウドネイティブアプリケーションのベストプラクティスとして、機密情報の挿入に環境変数が用いられる設定には以下のものが含まれる。 ... 外部サービスの認証情報 ... Twelve-Factor Appは設定を 環境変数 に格納する。 The Twelve-Factor App - III. 設定。

脚注

かんきようへんすう