環境変数

WindowsにもLinuxにも存在するので、環境変数についてはご存じだろう。環境変数の実装方法はWindowsとLinuxでは異なるのだが、ざっくり言って「実行元から実行先へと引き継がれていく変数」だと思ってもらえればよい。

代表的なものとして、WindowsでもLinuxでも確実に使われているのが環境変数PATHだ。これは実行可能ファイルを収めたフォルダやディレクトリのリストを保持するもので、この変数をサーチパスとしてファイルを探したりする目的で使われる。Linuxだとこれ以外にもさまざまな環境変数が使われている。環境変数はなくてはならない機能だ。

UNIX系のOSでほかのUNIX系のOSのバイナリを実行するような技術の場合(FreeBSDでLinuxのバイナリを実行するなど)、そもそものセマンティクスが似ているので結構自然とネイティブバイナリと同じように使うことができる。

しかし、これがWindows上でLinux(WSL)となると状況が異なる。セマンティクス(というか仕組みというか)が異なる部分があるので、ユーザー側からも変換の指定を行う必要が出てくる。そしてこれはWindows 10 Fall Creators Updateだとまだ実装されていないのでできないのだが、次のアップデートからは利用できるようになる見通しだ。今回はこの機能を紹介しておこうと思う。

WSLENVという特別な環境変数

詳しい話は「Share Environment Vars between WSL and Windows」にまとまっている。要するに、WindowsからLinuxを起動したり、LinuxからWindowsプロセスを実行したりする場合に、パスの自動変換が可能な環境変数「WSLENV」がWindows 10 Insider Preview Build 17063から導入された、というものだ。

以前、WindowsのファイルシステムのどこにLinuxディストリビューションが展開されているかを説明したことがあるが、あの面倒なパスの指定をしなくてもパスが指定できるような機能を持った特殊な環境変数だと思ってもらえればよいのではないかと思う。

この環境変数はWindowsではセミコロン区切り、Linuxではコロン区切りでパスのリストを保持する目的で使われる。それぞれのパスの最後にはサフィックスとして「/オプション」を指定することができ、オプションとしては「p」「l」「u」「w」を指定することができる。このオプションが変換方法の指定になっている。使い方はこんな感じだ。

export WSLENV=HOME/w:GOPATH/l:TMPDIR/p

オプションはそれぞれ次のような意味を持っている。

  • /p - パスを自動的に変換する
  • /l - 対象変数をパスリストとして展開する
  • /u - WindowsからWLSを起動する場合にパスを変換しない
  • /w - WLSからWindowsバイナリを実行する場合にパスを変換しない


オプションを指定することで目的に応じた処理ができるようになる。

/pを指定するとパスが自動的に変換される - 資料: Microsoft提供

/lを指定すると変数がパスリストであるとして展開したものが渡される - 資料: Microsoft提供

/uを指定するとWindowsからWSLを起動する場合にパスが変換されなくなる - 資料: Microsoft提供

/wを指定するとWSLからWindowsバイナリを実行する場合にパスが変換されなくなる - 資料: Microsoft提供

WSLではWSLからcmd.exeであるとかnotepad.exeであるとかといったWindowsバイナリを実行することができるのだが、こんな感じで環境変数WSLENVを使うとWSLからWindowsバイナリを実行する場合に意図した値を渡すといったことができるようになるし、またその逆もできるようになる。

WSLの利用が進めばWindowsとLinuxの間をシームレスに行ったり来たりしながら利用するケースや、そういったアプリケーションも出てくるだろう。WSLENVはそんなときにちょいちょい登場することになると思う。今後利用シーンが出てきたときにまた紹介しよう。

WSLは開発が活発に続く状況にある。今後も便利な機能が登場することになりそうだ。特にバックグラウンド機能の投入は早期の段階で希望されるところだが、ますますLinuxマシンとしてWindowsを利用できるようになりそうで今後の展開が楽しみである。