从WSL访问现有的Windows环境变量

6
我想在WSL bash提示符中访问现有的Windows环境变量,例如USERPROFILE。微软提供了关于使用WSLENV的信息,可以在这里找到。我已经尝试使用WSLENV解决此问题:

我将WSLENV添加为通常的Windows“环境变量”控制面板中的新系统变量,并将其设置为USERPROFILE/u。然后打开任务栏上的Ubuntu并输入以下命令:

$ echo $USERPROFILE

...但是没有返回任何内容。

3个回答

6

改进了Gábor的答案,因为我发现它有一个小bug,以这种方式获取的变量包含不可见的回车符号,可能会在后面引起意外问题。 以下是示例:

$ cd /mnt/c/
$ mkdir Windows_NT
$ tmpvar=`/mnt/c/Windows/System32/cmd.exe /C "echo %OS%"`
$ echo $tmpvar
Windows_NT

一切似乎都很好,但实际上并不是这样:

$ cd $tmpvar
: No such file or directory

这是因为 tmpvar 变量包含额外的回车字符 (也称为 ^M\r)。我们可以通过 ls 命令来检查:

$ ls -ld $tmpvar
ls: cannot access 'Windows_NT'$'\r': No such file or directory

为了去除该字符,输出可以使用sed或tr进行额外处理:
tmpvar=$(cmd.exe /C echo %OS%|sed $'s/\r$//')

或者

tmpvar=$(cmd.exe /C echo %OS%|tr -d '\r')

我还对命令进行了简化。在最近的Windows 10更新中,默认情况下$PATH WSL变量已经包含路径/mnt/c/Windows/System32,因此只需要使用cmd.exe

现在,lscd命令可以正常运行,没有错误:

$ ls -ld $tmpvar
drwxrwxrwx 1 ubuntu ubuntu 512 Feb 12 05:38 Windows_NT
$ cd $tmpvar
$ pwd
/mnt/c/Windows_NT

pwd 命令确认当前目录是否正确。


3

我有一个解决方法可以提供给你。

$ /mnt/c/Windows/System32/cmd.exe /C "echo %OS%"
Windows_NT
$ tmpvar=`/mnt/c/Windows/System32/cmd.exe /C "echo %OS%"`
$ echo $tmpvar
Windows_NT

我还没有检查WSLENV,但上面的方法应该可行。虽然不是很优雅。


0

由于这个问题是早在2018年提出的,我的第一个想法是@user2023370使用的Windows 10版本还不是17063。

其他需要指出的事情:

  • 从控制面板设置环境变量时,请确保WSL进程尚未运行。
  • 因为USERPROFILE环境变量是一个路径,所以您需要添加/p选项:
  WSLENV=USERPROFILE/up

为测试 /p 选项如何影响传递的变量,请在 cmd.exe 中尝试以下操作:

Microsoft Windows [Version 10.0.19044.1706]
(c) Microsoft Corporation. All rights reserved.

C:\Users\arttu>set WSLENV=USERPROFILE/up

C:\Users\arttu>wsl

$ echo $USERPROFILE
/mnt/c/Users/arttu

$ exit
logout

C:\Users\arttu>set WSLENV=USERPROFILE/u

C:\Users\arttu>wsl

$ echo $USERPROFILE
C:\Users\arttu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接