Bash
コマンドプロンプト
環境変数
WSL

WSLのbash上でコマンドプロンプトの環境変数を取得する

やりたかったのは、WSLのbashから、Windowsユーザのホームディレクトリ %USERPROFILE% を取得して、bashの環境変数に入れなおすことでした。

まずイマイチな方法。

$ export USERPROFILE=$(cmd.exe /c "echo %USERPROFILE%")
$ echo $USERPROFILE
C:\Users\username

一見、取れているのですが、この値をもとにbash上でcdしてみます。
# パイプで渡しているtrsedは、先頭に/mnt/をつけたり、ドライブレターを小文字にしたり、セパレータを/に変えたりしてます

$ cd $(echo $USERPROFILE | tr '\\' '/' | sed -E "s/^(.):/\/mnt\/\l\1/")
: そのようなファイルやディレクトリはありません

この通り、失敗します。

原因は%USERPROFILE%を出力しているコマンド、echoでした。
echoは通常最後に改行コードを追加するので、それもひっくるめてbashの環境変数$USERPROFILEに格納されているようです。

次に成功した方法。

echoで改行させなければよいのですが、コマンドプロンプトのechoは改行コード無しのオプションがないので、代わりにsetコマンドで%USERPROFILE%を出力します。

$ export USERPROFILE=$(cmd.exe /c "set /P<NUL=%USERPROFILE%")
$ echo $USERPROFILE
C:\Users\username

出力されている結果は一見同じですが、問題なくcdできます。

ちなみに、echoを使ってもsed等で末尾の改行コードを削除してもいけます。


追記。
ビルド17063以降なら、WSLENVという環境変数を使えば、相互に受け渡し可能らしいです。
https://news.mynavi.jp/itsearch/article/hardware/3364