環境変数って何なの?

2014-03-01
env
memo

proxy周りの設定を考えていた時に、環境変数ってリバースプロキシーでも引き渡せるのかという話になった。

そもそも環境変数ってのは・・・と考えはじめて、ふと思った。 環境変数って何?
Apacheで使う時の環境変数と、Linuxでシェルとか使っている時の環境変数って同じもの?

今さらながら、非常に認識が曖昧であったので、きちんと調べなおしてみた。
まず環境変数とは、そもそも何なのか。日本語wikipediaで検索してみる。

環境変数 - Wikipedia

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

うーん、まあ要するにプロセス間で使えるグローバル定数みたいな扱いですかね。 念のため、英語wikipediaもチェック。

Environment Variable - Wikipedia

Environment variables are a set of dynamic named values that can affect the way running processes will behave on a computer.

ざっと訳すと、『環境変数とは、動的に名前付けされた値のセットであり、コンピューター上で動作しているプロセスに影響を与える。』
つ、つまり・・・。プロセス間でデータを共有するために使うってことね。

英語版wikipediaには、環境変数の成り立ちについても簡単に書かれていました。

They were introduced in their modern form in 1979 with Version 7 Unix, so are included in all Unix operating
system flavors and variants from that point onward including Linux and OS X. From PC DOS 2.0 in 1982, all
succeeding Microsoft operating systems including Microsoft Windows, and OS/2 also have included them as
a feature, although with somewhat different syntax, usage and standard variable names.

(適当翻訳)環境変数が現在の形として導入されたのは、1979のVersion 7 Unix。その先のLinuxとかOS Xとかにも引き継がれていった。さらに1982にPC DOS 2.0に導入されて、MicrosoftのOSにも含まれるようになった。

にゃるほど。 さて、環境変数については基本的に理解できました。LinuxとかMacとか持っている人は、例えば次のコマンド

1
$ echo $HOME

windowsなら

1
$ echo %HOME%

ってしてみると、デフォルトで設定されている環境変数を参照できる。
他のプロセス(例えば、シェルとかバッチスクリプト)は、この環境変数を共有のデータとして参照できるわけです。いや便利ですね。

ここまで調べてみて思う。Apacheの文脈で出てくる環境変数とは違うよね?

すると、日本語wikpediaの環境変数に「5. HTTP環境変数」という項目が!?
環境変数 - Wikipedia 5. HTTP環境変数

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

なーんだ、つまり所謂環境変数ではなく、リクエストに情報を追加しているんだ。
同wikiには、下記のような言及もあり、ますます納得

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

うむうむ。違和感は正しかったのであった。

環境変数 ○ Unix系OS, Windows系OSのプロセス間でのデータ共有
環境変数 ☓ ApacheがCGIに対して付与するデータ

はて、英語ではなんて呼ぶんだろう。 英語サイトを検索してみると・・・。 Environment Variables in Apache

There are two kinds of environment variables that affect the Apache HTTP Server.

なるほど、Apacheに影響を及ぼせる環境変数は2種類あると書いてある。

First, there are the environment variables controlled by the underlying operating system.
These are set before the server starts. They can be used in expansions in configuration files,
and can optionally be passed to CGI scripts and SSI using the PassEnv directive.

1つ目は、プロセス間でのデータ共有を行うためのOSが提供している機能としての環境変数ですね。

Second, the Apache HTTP Server provides a mechanism for storing information in named variables
that are also called environment variables. This information can be used to control various operations
such as logging or access control.
The variables are also used as a mechanism to communicate with external programs such as CGI scripts.
This document discusses different ways to manipulate and use these variables.

2つ目は、Apache HTTP Serverが名前付き変数に情報を格納するメカニズムを提供・・・って
つまりどっちも名前は環境変数やないか!( ‘д‘⊂彡☆))Д´) パーン   

まとめ

環境変数は2種類存在する。

  1. Unix系OS, Windows系OSのプロセス間でのデータ共有
  2. ApacheがCGIに対して付与するデータ

環境変数の利用者はコンテキストによって、環境変数という言葉がどちらを指し示しているのかを自分で判断する必要がある。
また、2の環境変数はApacheのドキュメント内で定義されているのみであるので、その他webサーバでcgiを動かした場合において 同様の用途で利用するデータは、厳密には環境変数と呼ぶべきで無いのかもしれない。

以上、調査終了∠( ゚д゚)/