年末年始は「iTunes Match」を楽しめるかな、と秋頃に考えていましたが、ふと気付けば1月末。昨年末には日本でもスタートするはずだったものが、明らかに遅れています。そうこうしている間に、SONYが「Music Unlimited」の高音質化と値下げを発表するなど環境の変化も。夜明け前の国内音楽配信市場、どうなりますか……
さて、今回は「OS Xの環境変数」について。少々地味なテーマではあるが、シェルの環境変数とは性格が異なるうえに、Mountain Lionで扱い方が変更されたことから、敢えて取りあげるものだ。
OS Xの環境変数
OS Xには"UNIXの面影"が至るところに見られるが、Appleはそれをうまく隠ぺいするとともに、着実に改良をくわえている。ファームウェアからブート処理を引き継ぐ際にカーネルが読み込まれ、その後「launchd」がプロパティリストの記述に従い各種サービス(デーモン/エージェント)を起動していくことで現在のOS Xは起動されるが(参考)、launchd登場以前は「init」がその役割を果たすなど、UNIX系OSの伝統をほぼそのまま踏襲していた。
そのように起動シーケンスに改良が加えられたOS Xだが、「環境変数」の適用方法も、他のUNIX系OSとはひと味違った。ホームフォルダに「.MacOSX」フォルダを作成し、そこに環境変数の定義を記した「enviroment.plist」という名のプロパティリストファイルを保存しておくと、ログイン時に適用される、というしくみだ。その書式はXMLで、UNIXの流儀(シェルスクリプト)とは異なる。
UNIX系OSに馴染みがない人のために、「環境変数」を説明しておこう。環境変数とは、システムを構成するプロセスや任意のアプリケーション(コマンドやデーモン/エージェントを含む)から参照されうる変数のこと。その変数を定義することにより、システムの設定を変更したり、アプリケーションの挙動を変えたりすることが可能だ。現在有効な環境変数は、Terminalから「printenv」コマンドを実行すれば確認できる。
この環境変数は、呼び出されたプロセスとその子プロセスに共通の情報として参照される。一般的にはシェルが起動されるとき初期化ファイルの内容を反映する形で設定されるため、「~/.bashrc」や「~/.bash_profile」などのドットファイルに記述しておくことが多いが、いわゆるAqua GUIは(Terminal上で起動される)シェルの子プロセスではない。前述した「~/.MacOSX/enviroment.plist」が、Aqua GUIの環境変数を定義するための初期化ファイルなのだ。いや、「だった」のだ。
Mountain Lionで環境変数を使う
Mountain Lionにアップデートしてからある日、「GLENABLEDEBUGATTACH」という環境変数が読み込まれないことに気付いた。これは、GIMPが正常に起動しない問題を回避するためのもので、「~/.bashrc」や「~/.bashprofile」に記述しても意味がないため(シェルからGIMPを起動すれば話は別だが)、「~/.MacOSX/enviroment.plist」に記述していたのだ。それが、内容を一切変更していないにもかかわらず、Mountain Lionへのアップデート後「printenv」コマンドで確認できなくなった。
いろいろ調べたところ、この問題はバンドル型アプリケーション(*.app)の仕様変更が原因と判明。アプリケーションの動作に必要なLaunch Servicesキーのうち、環境変数のリストを格納する「LSEnvironment」は、以前「~/.MacOSX/enviroment.plist」を参照していたが、Mountain Lion以降はバンドル内の「Info.plist」を参照するようになったのだという。
では、Aqua GUIでは環境変数が使用できないか、というとさにあらず。代替として、「/etc/launchd.conf」または「~/.launchd.conf」を定義する方法が用意されたのだ。前者はシステムワイドに(OS Xの起動時点から)使いたい環境変数用に、後者はユーザのログインと同時に使いたい環境変数用に、と使い分ければいい。
環境変数を定義する書式は、シェルと同じ。OS Xデフォルトのシェルであるbashの場合、setenvコマンドを使い記述すればいい。たとえば、「JAVA_HOME」を「/Library/Java/Home」に設定したければ、以下のコマンドラインをTerminalで実行すればいい。
$ echo "setenv JAVA_HOME /Library/Java/Home" > ~/.launchd.conf