• The Environment variable Man

WindowsやLinux/Unixなどには環境変数と呼ばれるものがある。環境変数は、シェルから起動されるプログラムに対して、何らかのテキスト情報を伝達するもの。現在の環境変数の元になったのは、Version 7 UNIXに搭載されたもの。すべてのプログラムからアクセス可能な変数とすることでさまざまな応用が可能になった。たとえば、アプリケーションのオプション設定値を環境変数で表現することで、毎回起動オプションを指定する必要がなくなった。あるいは、エディタを指定しておくことで、必要に応じて、ユーザーの好みのエディタプログラムを起動させることも可能になる。

もともとシェルには、変数があり、これを使うことで、シェルスクリプト間では値を渡すことができた。また、起動するコマンドの引数をシェル変数とすることで、パラメーターを引き渡すこともできた。この仕組みを汎用的に使えるようにシステム側の機能としたのが環境変数だ。プログラムはAPIを介して、環境変数から必要な情報を得るようにしたことで、汎用性が高まった。

UNIXの標準シェル(sh。Bourneシェル)では、「変数名=値」としてシェル変数を定義したあと、「export 変数名」というコマンドを使って、環境変数を定義する。後継となるbash(Bourne Againシェル)では、2つを併せて「export 変数名=値」とすることができる。

環境変数は、親となるプロセス側で設定を行い、親から起動されたプログラム(子プロセス)がこれを利用することができる。プロセスが起動されると、その実行環境に、親の環境変数がコピーされる。起動されたプロセスで自由に環境変数を書き換えてもいいが、プロセスが終了すると環境変数はどこにもコピーされることなく消えてしまう。環境変数による情報の伝達は、親から子への一方通行なのである。

これは、シェルのスクリプトについても適用される。通常、シェルからスクリプトを起動すると、シェル自身が子プロセスとして起動し、スクリプトを実行する。このため、スクリプトに環境変数を変更する記述を書いても実行が終われば消えてしまう。仕組みを聞けば、なるほどと理解するが、初めてシェルを使ったという状況では、簡単には想像できない。

1つには、多くのシェルには、初期設定を行うスクリプトが用意されていて、その中では、環境変数を自由に定義できる。これを見ると、スクリプトで環境変数を書き換えて環境を切り替えることができると思いがちだ。しかし、これらの初期設定スクリプトは、実行が終わっても起動されたシェルプロセスは終了せずに、プロンプトを出して、入力待ちになる。つまり、起動されたシェルがそのまま継続して動いているのである。

しかし、スクリプトを使って環境変数を書き換えたいとか、実行中のシェルに書き直した初期化スクリプトを適用したいなんて場合もあるので、UNIXのsh(Bourneシェル)には、"."(ドット)という短いコマンドがあった。このコマンドは後続するファイルを読み込んで実行し、それを現在の環境に反映する。短いコマンド名が使われたのは、利用頻度が高かったからだろう。実際、シェルの初期化スクリプトを書き換えるような場合、エディタとこのコマンドを繰り返し利用することが多い。

BSD系UNIXに搭載されたcsh(Cシェル)では、同じ機能には、"source"(ソース)という名称がついた。Linuxで広く使われているbashでは、"."も"source"も同じ機能のコマンドである。このあたりからこのコマンドを「Dot-Source」(ドットソース)と呼ぶことが多くなったと記憶する。逆にいうと、bash以前は、shとcshの等価なコマンドでしかなかった。単なるピリオド1文字のコマンドなのに「ドットソース」という奇妙な名前なのは、こういう事情だからだ。

さらにWindowsに搭載されているWindows PowerShell(およびPowerShell)にも"."という「演算子」があり、bashのドットソースと同じ機能を持つ。奇妙なことに、この演算子の名前が「ドットソース」であり、この演算子が行うことを「ドットソーシング」と呼んでいる。しかも、Microsoftのドキュメントでは、そもそもドットソースが何なのかを解説していない。機能を定義した開発者は、わかってるのだろうが、何か、常識が別のところにあるような感覚を覚える。

今回のタイトルネタは、フィリップ・K・ディックの「The Variable Man」(邦題 変数人間。ハヤカワSF文庫)である。同名の作品を含む、短編集のタイトルでもある。人類の運命を計算するSRBコンピュータ。しかし、過去から来た男の存在が計算を不可能にした。その男、トマス・コールは「Variable Man」と呼ばれた。「ドット」コマンド、「ソース」コマンドから「ドットソース」となり、さらには「ドットソーシング」になるとは、どんなコンピュータでも予測不可能だろう。