WindowsからWSLへ値を渡す
指定した環境変数を、WSLに渡す方法です。
ただし、渡された環境変数をWSL上で変更しても、元のWindowsでは変更は反映されません。
渡したい環境変数は、環境変数 WSLENV に変数名を : で区切って指定します。
この時、各変数名の後に / で区切って次のオプションを指定できます。
p と l はマイクロソフトのサイトの説明では異なる機能のようでしたが、試してみると以下のように同じ機能でした。
オプション | 機能 |
---|---|
(指定なし) | WSLへ値を渡します |
w | WSLからWindowsへ値を渡します (後述の「WSLからWindowsへ値を渡す」を参照) |
u | WSLへ値を渡します |
p | 複数のパスの場合は、パスの区切り文字を Windows型(;)から WSL/Linux型(:) に変換します。 また、Windows形式のパス表記を、WSL(Linux)形式にして渡します。 渡すパスはフルパスで記述しておく必要があります。 |
l | 複数のパスの場合は、パスの区切り文字を Windows型(;)から WSL/Linux型(:) に変換します。 また、Windows形式のパス表記を、WSL(Linux)形式にして渡します。 渡すパスはフルパスで記述しておく必要があります。 |
例えば、次のように環境変数をセットします。
環境変数 VAL1、VAL2、PATHS が WSLで参照できるように指定しています。
コマンドプロンプト
set VAL1=VALUE1
set VAL2=VALUE2
set VAL3=VALUE3
set PATHS=c:\test1\test2;c:\test3\test4
set WSLENV=VAL1:VAL2/u:VAL3/w:PATHS/l
PowerShell
$Env:VAL1="VALUE1"
$Env:VAL2="VALUE2"
$Env:VAL3="VALUE3"
$Env:PATHS="c:\test1\test2;c:\test3\test4"
$Env:WSLENV="VAL1:VAL2/u:VAL3/w:PATHS/l"
環境変数をセットしたら、WSLを起動し export で環境変数を確認します。
次のように、VAL1、VAL2、PATHS が、WSL へ渡っています。また WSLENV も渡っています。
PATHS は、パスの区切り文字や表記が、WSL(Linux)形式に変換されています。
$ export
:
declare -x PATHS="/mnt/c/test1/test2:/mnt/c/test3/test4"
declare -x VAL1="VALUE1"
declare -x VAL2="VALUE2"
declare -x WSLENV="VAL1:VAL2/u:VAL3/w"
:
なお、/p /l で指定したパスがフルパスでは無い場合、WSL起動時に次のエラーがターミナルに表示されます。
パスはフルパスで記述しておく必要があります。
<3>WSL (303) ERROR: UtilTranslatePathList:2852: Failed to translate c:test3\test4
次に、WSL上で、VAL1、VAL2、VAL3 の値を変えた場合を確認してみます。
export VAL1=VALUE4
export VAL2=VALUE5
export VAL3=VALUE6
その後、WSL から exit して、Windowsのコマンドプロンプト/PowerShellへ戻ります。
コマンドプロンプト/PowerShellで環境変数を確認すると、WSL上でセットした VAL1、VAL2、VAL3 の値は反映されておらず、Windowsで元々セットしていた値のままになっています。
WSLENV で VAL3/w のように /w が付いていた VAL3 も、値が変わっていません。
/w がついていると、WSLからWindows(ここではバッチ/Powershellスクリプト)へ値を渡しますが、WSLからexitしてWindowsに戻る際は、値が変わりません。
WSLからWindowsへ値を渡す
指定した環境変数を、Windowsに渡す方法です。
ただし、渡された環境変数をWindows上で変更しても、元のWSLでは変更は反映されません。
渡したい環境変数は、環境変数 WSLENV に変数名を : で区切って指定します。
この時、各変数名の後に / で区切って次のオプションを指定できます。
p と l はマイクロソフトのサイトの説明では異なる機能のようでしたが、試してみると以下のように同じ機能でした。
オプション | 機能 |
---|---|
(指定なし) | WSLへ値を渡します |
w | WSLからWindowsへ値を渡します |
u | WindowsからWSLへ値を渡します(先述の「WindowsからWSLへ値を渡す」を参照) |
p | 複数のパスの場合は、パスの区切り文字を WSL/Linux型(:) から Windows型(;)に変換します。 また、WSL(Linux)形式のパス表記を、Windows形式にして渡します。 |
l | 複数のパスの場合は、パスの区切り文字を WSL/Linux型(:) から Windows型(;)に変換します。 また、WSL(Linux)形式のパス表記を、Windows形式にして渡します。 |
例えば、次のように環境変数をセットします。
環境変数 VAL1、VAL3、PATHS が WSLで参照できるように指定しています
export PATHS="/mnt/c/test1/test2:/mnt/c/test3/test4"
export VAL1=VALUE1
export VAL2=VALUE2
export VAL3=VALUE3
WSLENV=VAL1:VAL2/u:VAL3/w:PATHS/l
環境変数をセットしたら、コマンドプロンプト(cmd.exe /k 実行)や PowerShell(powershell.exe 実行)を起動し、環境変数を確認します。
(コマンドプロンプトでは set、PowerShell では Get-ChildItem env: )
次のように、VAL1、VAL3、PATHS が、Windows へ渡っています。また WSLENV も渡っています。
PATHS は、パスの区切り文字や表記が、Windows形式に変換されています。
(コマンドプロンプトの場合)
:
PATHS=C:\test1\test2;C:\test3\test4
VAL1=VALUE1
VAL3=VALUE3
WSLENV=VAL1:VAL2/u:VAL3/w:PATHS/l
:
なお、/p /l で指定したパスがフルパスでは無い場合でも問題ありません。
また、WSL で PATHSが “/bin/test5/test6” であった場合は、Windowsでは次のように、/bin が Windowsから見たWSL上のパスになります。
(コマンドプロンプトの場合)
set
:
PATHS=\wsl.localhost\Ubuntu-24.04\bin\test5\test6
:
次に、コマンドプロンプト/PowerShell上で、VAL1、VAL2、VAL3 の値を変えた場合を確認してみます。
コマンドプロンプト
set VAL1=VALUE4
set VAL2=VALUE5
set VAL3=VALUE6
PowerShell
$Env:VAL1="VALUE4"
$Env:VAL2="VALUE5"
$Env:VAL3="VALUE6"
その後、exit して、WSL へ戻ります。
WSLで環境変数を確認すると、コマンドプロンプト/PowerShell上でセットした VAL1、VAL2、VAL3 の値は反映されておらず、WSLで元々セットしていた値のままになっています。
WSLENV で VAL2/u のように /u が付いていた VAL2 も、値が変わっていません。
/u がついていると、WindowsからWSLへ値を渡しますが、Windows上のコマンドプロンプト/PowerShellからexitしてWSLに戻る際は、値が変わりません。
参考
ファイル システム間での作業 | Microsoft Learn
Windows Subsystem for Linuxガイド 第9回 Win32相互運用性 環境変数編 | マイナビニュース
Windows 10とWSLの相互運用性を高める新たな環境変数「WSLENV」 – 阿久津良和のWindows Weekly Report | マイナビニュース
コメント