帰る家、HOMEがあるという事実は、幸せにつながる。良いことだよ。

2010-12-09

当初は閑古鳥が鳴くかと思われた Win32 トラックも連日熱い記事がアップされていてすばらしいことですね。一部の人は二巡目に入りましたが、まだまだ参加可能ですので、興味を持たれた方はぜひ ATND に登録してくださいませ。また、twitter などで「次書くよ」と宣言していただけるとなお助かります。

さて、9日目の今日は頭文字Iの覆面ライターがいまさら感あふれるバッドノウハウをお送りします。

みなさんホームディレクトリというものはご存じでしょうか? Unix 系の環境では /home/(ユーザ名) になっていることが多いようですが、窓使いにとってはコマンドプロンプトを引数なしで立ち上げたときのカレントディレクトリ、というのがわかりやすいかもしれません。具体的にどこになっているかは Windows のバージョンや設定に依存しますが、日本語版の Windows 2000 と XP では「C:\Documents and Settings\(ユーザ名)」、Vista と Windows 7 では「C:\Users\(ユーザ名)」というのが一般的です。

Windows の場合、この情報は HOMEDRIVE と HOMEPATH という環境変数を見ることで確認できます。コマンドプロンプトからであれば「set HOMEDRIVE (または set HOMEPATH)」を実行することで現在の(そのプロンプト内での)設定が表示されますし、デフォルトの設定を見たければ、左下の「スタート」メニューからコントロールパネルを開き、「システム」「詳細(設定)」などと書いてある項目をたどっていくと、環境変数を設定できるボタンが見つかります。もちろん Perl を使って調べてもよいでしょう。ワンライナーで書くならこの通りですね。

> perl -e "print qq/$ENV{HOMEDRIVE}$ENV{HOMEPATH}/"

ただし、この書き方は Windows でしか通用しません。Unix 系の環境ではふつう HOME という環境変数に HOMEPATH に相当するものが格納されています。そのため、CPAN モジュールの世界では File::HomeDir というモジュールを利用してこの差を吸収するのがベタープラクティスになっています。これも同じくワンライナーで試してみましょう。ふつうは先ほどと同じ結果が表示されたはずです。

> perl -MFile::HomeDir -e "print File::HomeDir->home"

ところで、このホームディレクトリはふつう(ユーザごとに異なる)設定ファイルや作業ファイルの置き場所としても利用されます。この事情は Perl のスクリプトやモジュールの場合も同じなのですが、このホームディレクトリないしその配下のパスを外部の実行ファイルなどに渡すようなスクリプト/モジュールの場合、このパスに空白やマルチバイト文字が含まれているとおかしなエラーを吐くことがあります。

もちろん本当はソースをあらためてパス名を適切にクォートするか、さらに余裕があるなら Win32 モジュールに用意されている GetANSIPathName などを呼び出して問題が起こらないパス名に変換してやればよいのですが、そこまでする余裕がないときは適当な(空白などを含まない)ディレクトリを用意して、そのパスを HOME という環境変数に指定してみてください。

> set HOME=c:\home\foobar
> perl -MFile::HomeDir -e "print File::HomeDir->home"
# c:\home\foobar

File::HomeDirは、たとえ Windows 環境であっても HOME 環境変数が指定されている場合はその値を優先してくれます。そのため、この変数に空白を含まないパスを指定しておくことで、Windows の設定がどうであっても、空白などを含むパスによる問題を回避できるようになります(もちろん HOME 環境変数はネイティブアプリケーションのホームディレクトリには影響を与えません。変わるのは Perl (や同種の Unix 系アプリケーション)のホームディレクトリだけです)。

Vista 以降は標準のホームディレクトリに空白が含まれなくなっているため、いまとなってはあまりありがたみのないノウハウですが、Windows 標準のホームディレクトリには誤って消してしまうと問題になるシステムディレクトリがたくさん入っています。あれこれ気を遣う必要のない自分専用のマシンで、ホームディレクトリ以下にごりごりプロジェクトファイルをつくるような方は Perl 用のホームディレクトリはシステム用のそれとわけておいた方が何かと便利だとおもいますよ。

また、同様の理由で、Perl から呼び出すかもしれないアプリケーションやライブラリはいわゆる「C:\Program Files\」以下にはインストールしないのが吉、とか、環境変数まわりではほかにも TMP や TZ、LANG、EDITOR あたりを適切に指定することで問題解決することがある、ということも覚えておくとよいでしょう。

次は Kansai.pm の turugina さんですね。