このページの本文へ

Windows Info 第115回

RS4のWindows Subsystem for Linuxでは環境変数の共有が可能に

2018年02月04日 10時00分更新

文● 塩田紳二 編集● ASCII編集部

  • この記事をはてなブックマークに追加
  • 本文印刷

 Windows 10の次期アップデートであるRS4で予定されているWindows Subsystem for Linux(以下、WSL)の機能拡張には、Win32環境とWSL環境での環境変数の共有がある。

 RS2で実装されたWin32相互運用性で、WSL内でWin32デスクトップアプリケーションの実行が可能になったとき、すでにPath環境変数は、WSLとWin32で共有されていた。しかし、起動されるWSLやWin32の環境変数を指定する方法がなかった。RS4ではWSLとWin32でユーザーの指定する任意の環境変数を共有でき、このとき、環境変数が保持しているdrvfs側のファイルパスを自動変換するという機能が追加された。

WindowsとLinuxの環境変数

 共有設定を解説する前に、確認の意味を含めて、WindowsとLinuxの環境変数について解説しておく。

 環境変数とは、プログラムから読み出しが可能な環境情報で、名前が付けられていること、設定を変数の設定のように代入文の形式で行なうためにこの名がある。たとえば、コマンドラインの起動オプションのデフォルト値やプログラムの動作を変更するような場合に使われることが多い。また、前述のように起動されるプログラムやスクリプトに対するものであり、メモリ上のプロセス情報の一部として親プロセスから子プロセスに継承される。

 環境変数の特性上、起動する側で設定した環境変数は起動される側でも参照可能だが、起動された側で環境変数を使って、起動した側に情報を戻すことはできない。そもそも環境変数はプロセスに付随して作られるものであり、親プロセスから子プロセスへ環境変数が引き継がれるものの、子プロセスの環境変数はプロセスの終了時に破棄されてしまうからである。

 Win32の場合、環境変数はAPIから設定することもできるが、コマンドラインからは、

set 環境変数名=値 # cmd.exeの場合
setx 環境変数名=値 # powershellの場合

として設定可能だ。

 Win32では、環境変数名は、「=」以外の文字ならば2バイト文字も指定できる。変数名として大文字小文字は区別されないため、「EnvVar」と「ENVVAR」、「envvar」は同一の環境変数と見なされる。ただし、変数名の大文字小文字の表記は、ファイルなどと同じく最初の指定が保存される。これは、環境変数を消去するまで保存される。

 変数値は文字列として格納される。変数値の最大サイズは32767文字まで(2バイトのUnicodeとなるため64キロバイト以下)だが、Windowsのコマンドラインや設定コマンドでの制限もあるため、常に最大サイズの変数値を指定できるとは限らない。

 環境変数を参照する場合、環境変数名を「%」で挟んで、

echo %ENV%

とする。ただし、変数を確認するだけなら、「set 環境変数名」とすれば、指定した環境変数を表示できる。また、引数無しでsetコマンドを使えばすべての環境変数を表示する。

 これに対してLinuxの環境変数は、シェル変数を「export」して設定する。シェル変数とは、シェルスクリプト(プログラム)内で利用する変数である。このため環境変数の変数名や内容に関しては、シェル変数に従う。環境変数名は、英数字とアンダースコア(アンダーライン)のみで先頭の文字はアンダースコアまたは英字である。アンダースコア以外の記号は一切使用できず、英字の大文字小文字は区別され、別の変数名として扱われる。

 環境変数を定義するには、exportコマンドを使い

export シェル変数名=変数内容
export すでに定義してあるシェル変数名

とする。参照する場合には、

echo $シェル変数名
echo

とする。後者は、後続する文字などと区別する場合に使うが単独でシェル変数を参照する場合には前者の表記でも問題ない。また、Windowsのsetコマンドに相当するのは、「printenv」コマンドである。bash内ではsetコマンドは、シェル変数の一覧となっており、大量の表示が出るので注意されたい。

 WindowsとLinuxの環境変数の違いから、RS4の環境変数共有機能では、アンダースコア以外の記号は使わないようにし、Linux側の環境変数に合わせ、環境変数名はASCIIコードの英数字で大文字で指定するのがいいだろう。

 アンダースコア以外の記号がある環境変数名はWSLENVで指定しても共有できない。基本的にLinuxは小文字文化なので、プログラミングに利用するシェル変数には小文字を使い、環境変数名には、大文字を使うことが多い(ただし、あくまでも慣習である)。

 Linux環境ではシェル変数(および環境変数)を大量に使い、多くのコマンドが環境変数による実行の制御を行なっている。また、シェル自体が予約のシェル変数を持ち、システム自体にも予約の環境変数名がある。WSLで使われるLinuxディストリビューションであるUbuntuやSUSEではbashが使われているので、「man bash」コマンドやインターネット検索で予約のシェル変数などを調べることができる。

 これに対してWin32側は大文字小文字を区別しないのでどちらでも同じである。環境変数名の英字を大文字のみにすることでことで、Linuxのシェル変数とWin32で利用する環境変数名が衝突する可能性を低くできる。

環境変数の共有設定

 RS4に搭載された環境変数のWin32とWSLの環境変数の共有機能は、共有したい環境変数名を「WSLENV」という環境変数に「:」(コロン)で区切って指定するというものだ(Win32側でもコロンで区切る点に注意)。

 このとき、各環境変数名にはパスなどの変換を指定するオプション(以下の表)を付けることができる。これにより、起動前の環境で環境変数の中身を指定し、起動された環境でそれを利用することが可能になる。

オプション 意味
/p 単独パスの変換
/l パスリストの変換
/u パスの変換をせずに共有
/w Win32相互運用性に渡さない環境変数※

※:WSLを起動する前のWin32側で指定した場合のみ有効

 このとき、drvfs上のファイルパスに関しては、変換を指定することができる。オプション/pは、環境変数の値が単独のパスであり、これを変換して共有することを意味する。つまり、「c:\~」と「/mnt/c/~」のdrvfsのパスを変換する。

 これに対して「/l」は変換の対象となる環境変数の値が複数のパスを記述したリストであることを示す。パス同士は、Win32側ではセミコロンで、WSL側ではコロンで区切る。PATH環境変数のような複数のパスを含む場合に指定する。なお、変換できるのは、ファイルのパスのみでワイルドカードを含む場合、エラーとなり共有されない。

 /uと/wは、それぞれWSL環境、Win32環境でのみ共有を行う環境変数を指定するものとマイクロソフトのブログには記載がある(https://blogs.msdn.microsoft.com/commandline/2017/12/22/share-environment-vars-between-wsl-and-windows/)。

 WSLENVで/uが指定された環境変数は、Win32からWSLを起動したときのみ共有され、/wは、逆でWSLからWin32を起動したときのみ共有が行われると記述されている。だが、環境変数の振る舞いはちょっと複雑なのでこのオプションの挙動もちょっと複雑である。WSLからWin32相互運用性を使って起動されたWin32では、環境変数は、Win32起動セッションのものを継承する。この挙動は、RS3でもRS4でも同じだ。

WSLから起動されたWin32環境は、WSLを起動したWin32の環境を引き継いでいる

 まず、Win32→WSLの場合、/wを指定した環境変数は、WSL側では共有されない。そもそも、WSLは、PATH以外の環境変数を共有しないので/wは無意味に見える。だが、Win32相互運用性でWin32環境を起動すると、/wを指定した環境変数は継承されない。つまり、「/w」は、Win32相互運用性でプログラムに対して見せたくない起動セッションで定義されている環境変数を指定するものといえる。

 これに対して/uは、Win32起動セッションからWSLを起動した場合のみ共有する環境変数を指定するものだが、意味としては「環境変数の共有を行うがパスの変換は行わずにWSLと共有する」だ。/pや/lは、パスを変換してしまうが、/uは変換しないで環境変数を共有する場合に使う。なお、Win32相互運用性では、Win32起動セッションの環境変数(WSLENVで/wが指定されているものを除く)を継承しているので、/uを指定した環境変数は、そのまま有効だ。

 実際の動作を試してみたのが下の画面だ。

3つのスクリプト(Batchとbash)で環境変数共有(WSLENV)の挙動を確かめてみた

 この例では、DIRコマンドのオプションを指定するDIRCMD環境変数をWin32相互運用側に見せないように/wで指定している。なお、理由は不明だが、WSL側でWSLENVを変更する場合、exportコマンドによる変更はうまく動作せず、実行コマンドの前にWSLENVへの代入文を置く必要がある。この構文は、bashでの環境変数の一時的な変更とコマンドの実行の形式である。このデモではFILEPという環境変数をWSLENVに追加している。

 Win32相互運用性で起動されたcmd.exeでは、DIRCMD環境変数は設定されておらず、最後に実行したDIRコマンドの結果は、最初に行なったDIRコマンドと順番が違っている。

カテゴリートップへ

この連載の記事
1
【整備済み品】富士通 ノートパソコン LIFEBOOK U9310 13.3型FHD(1920x1080) 超軽薄 ノートPC/第10世代 Core i5-10310U@1.7GHz/ 8GB メモリ/高速ストレージ SSD/Webカメラ/WIFI/Type-C/HDMI/win11&MS Office 2019 搭載 ビジネス 在宅勤務向け パソコン (メモリ:8GB/SSD:256GB)
【整備済み品】富士通 ノートパソコン LIFEBOOK U9310 13.3型FHD(1920x1080) 超軽薄 ノートPC/第10世代 Core i5-10310U@1.7GHz/ 8GB メモリ/高速ストレージ SSD/Webカメラ/WIFI/Type-C/HDMI/win11&MS Office 2019 搭載 ビジネス 在宅勤務向け パソコン (メモリ:8GB/SSD:256GB)
¥39,800
2
【整備済み品】中古 ノートパソコン NEC VersaPro VKT16/15.6型・第8世代Core i5-8250U(最大動作3.4GHz)/快適メモリ8GB/ 高速SSD 256GB/Win11 Pro/MS Office 2019付属/テンキー付, Webカメラ, USB3.0, HDMI, VGA, 有線LAN, WIFI内蔵, Bluetooth/ACアダプター付属/180日間保証
【整備済み品】中古 ノートパソコン NEC VersaPro VKT16/15.6型・第8世代Core i5-8250U(最大動作3.4GHz)/快適メモリ8GB/ 高速SSD 256GB/Win11 Pro/MS Office 2019付属/テンキー付, Webカメラ, USB3.0, HDMI, VGA, 有線LAN, WIFI内蔵, Bluetooth/ACアダプター付属/180日間保証
¥26,880
3
【整備済み品】富士 通 2in1ノートパソコン V727【本体のみ】/第7世代Core M3/12.3型タッチパネル1920×1080/メモリ 8GB/SSD 128GB/Win 11/MS Office 2019/USB 3.1/Type-C/無線WIFI/オーディオ内蔵/WEBカメラ/初期設定済
【整備済み品】富士 通 2in1ノートパソコン V727【本体のみ】/第7世代Core M3/12.3型タッチパネル1920×1080/メモリ 8GB/SSD 128GB/Win 11/MS Office 2019/USB 3.1/Type-C/無線WIFI/オーディオ内蔵/WEBカメラ/初期設定済
¥9,600
4
Lenovo Chromebook クロームブック IdeaPad Flex 3i Gen8 12.2インチ インテル® プロセッサー N100搭載 メモリ4GB eMMC 64GB バッテリー駆動12.0時間 重量1.25kg アビスブルー 82XH001KJP
Lenovo Chromebook クロームブック IdeaPad Flex 3i Gen8 12.2インチ インテル® プロセッサー N100搭載 メモリ4GB eMMC 64GB バッテリー駆動12.0時間 重量1.25kg アビスブルー 82XH001KJP
¥29,800
5
【Amazon.co.jp限定】 ASUS ノートパソコン Vivobook 15 X1502VA 15.6インチ インテル Core i7 13620H メモリ16GB SSD 1TB Windows 11 バッテリー駆動 8.9時間 重量1.7kg PC Game Pass 3ヶ月利用権付き クワイエットブルー X1502VA-I7H161W
【Amazon.co.jp限定】 ASUS ノートパソコン Vivobook 15 X1502VA 15.6インチ インテル Core i7 13620H メモリ16GB SSD 1TB Windows 11 バッテリー駆動 8.9時間 重量1.7kg PC Game Pass 3ヶ月利用権付き クワイエットブルー X1502VA-I7H161W
¥104,800

Amazonのアソシエイトとして、ASCII.jpは適格販売により収入を得ています。

ASCII倶楽部

注目ニュース

  • 角川アスキー総合研究所

プレミアム実機レビュー

ピックアップ
1
KIOXIA(キオクシア) 旧東芝メモリ microSD 128GB UHS-I Class10 (最大読出速度100MB/s) Nintendo Switch動作確認済 国内サポート正規品 メーカー保証5年 KLMEA128G
KIOXIA(キオクシア) 旧東芝メモリ microSD 128GB UHS-I Class10 (最大読出速度100MB/s) Nintendo Switch動作確認済 国内サポート正規品 メーカー保証5年 KLMEA128G
¥1,880
2
Anker PowerLine III Flow USB-C & USB-C ケーブル Anker絡まないケーブル 240W 結束バンド付き USB PD対応 シリコン素材採用 iPhone 17 / 16 / 15 / Galaxy iPad Pro MacBook Pro/Air 各種対応 (1.8m ミッドナイトブラック)
Anker PowerLine III Flow USB-C & USB-C ケーブル Anker絡まないケーブル 240W 結束バンド付き USB PD対応 シリコン素材採用 iPhone 17 / 16 / 15 / Galaxy iPad Pro MacBook Pro/Air 各種対応 (1.8m ミッドナイトブラック)
¥1,390
3
【Amazon.co.jp限定】バッファロー microSD 32GB 100MB/s UHS-1 U1 microSDHC【 Nintendo Switch 対応 】V10 A1 IPX7 Full HD RMSD-032U11HA/N
【Amazon.co.jp限定】バッファロー microSD 32GB 100MB/s UHS-1 U1 microSDHC【 Nintendo Switch 対応 】V10 A1 IPX7 Full HD RMSD-032U11HA/N
¥1,880
4
Anker USB Type C ケーブル PowerLine USB-C & USB-A 3.0 ケーブル iPhone 17 / 16 / 15 /Xperia/Galaxy/LG/iPad Pro/MacBook その他 Android 等 USB-C機器対応 テレワーク リモート 在宅勤務 0.9m ホワイト
Anker USB Type C ケーブル PowerLine USB-C & USB-A 3.0 ケーブル iPhone 17 / 16 / 15 /Xperia/Galaxy/LG/iPad Pro/MacBook その他 Android 等 USB-C機器対応 テレワーク リモート 在宅勤務 0.9m ホワイト
¥660
5
KIOXIA(キオクシア)【日本製】USBフラッシュメモリ 32GB USB2.0 国内サポート正規品 KLU202A032GL
KIOXIA(キオクシア)【日本製】USBフラッシュメモリ 32GB USB2.0 国内サポート正規品 KLU202A032GL
¥980
6
【Amazon.co.jp限定】 ロジクール 静音 ワイヤレス トラックボール マウス M575SPd Bluetooth Logibolt 無線 windows mac iPad OS Chrome トラックボールマウス ブラック M575 M575SP 国内正規品 ※Amazon.co.jp限定 壁紙ダウンロード付き
【Amazon.co.jp限定】 ロジクール 静音 ワイヤレス トラックボール マウス M575SPd Bluetooth Logibolt 無線 windows mac iPad OS Chrome トラックボールマウス ブラック M575 M575SP 国内正規品 ※Amazon.co.jp限定 壁紙ダウンロード付き
¥5,280
7
Amazon Kindle Paperwhite (16GB) 7インチディスプレイ、色調調節ライト、12週間持続バッテリー、広告なし、ブラック
Amazon Kindle Paperwhite (16GB) 7インチディスプレイ、色調調節ライト、12週間持続バッテリー、広告なし、ブラック
¥18,980
8
バッファロー SDカード 128GB 100MB/s UHS-1 スピードクラス1 VideoSpeedClass10 IPX7 Full HD データ復旧サービス対応 RSDC-128U11HA/N
バッファロー SDカード 128GB 100MB/s UHS-1 スピードクラス1 VideoSpeedClass10 IPX7 Full HD データ復旧サービス対応 RSDC-128U11HA/N
¥2,000
9
キヤノン Canon 純正 インクカートリッジ BCI-381(BK/C/M/Y)+380 5色マルチパック BCI-381+380/5MP 長さ:5.3cm 幅:13.9cm 高さ:10.75cm
キヤノン Canon 純正 インクカートリッジ BCI-381(BK/C/M/Y)+380 5色マルチパック BCI-381+380/5MP 長さ:5.3cm 幅:13.9cm 高さ:10.75cm
¥5,545
10
エルパ(ELPA) 扉付タップラン 電源タップ 延長コード 125V 3m 3個口 ホワイト WBT-N3030B(W)
エルパ(ELPA) 扉付タップラン 電源タップ 延長コード 125V 3m 3個口 ホワイト WBT-N3030B(W)
¥652

Amazonのアソシエイトとして、ASCII.jpは適格販売により収入を得ています。

デジタル用語辞典

ASCII.jpメール デジタルMac/iPodマガジン