从 WSL 访问现有 Windows 环境变量

Accessing existing Windows environment variables from WSL

我想通过 WSL bash 提示访问现有的 Windows 环境变量,例如 USERPROFILE。 Microsoft 提供了有关使用 WSLENV here 的信息,我已尝试使用此信息:

我在常用的 Windows "Environment Variables" 控制面板中添加了 WSLENV 作为新的系统变量,并将其设置为 USERPROFILE/u。然后我从任务栏打开 Ubuntu,然后键入:

$ echo $USERPROFILE

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

为您找到解决方法。

$ /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 但上面那个应该可以。虽然远非优雅。

改进了 Gábor 的回答,因为我发现它有一个小错误,通过这种方式获得的变量包含不可见的回车 return 字符,这可能会导致以后出现意外问题。 这是示例:

$ 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 变量包含额外的回车 return 字符(又名 ^M\ r) 最后。我们可以通过 ls 命令检查:

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

为了删除该字符,可以使用 sedtr 额外处理输出:

tmpvar=$(cmd.exe /C echo %OS%|sed $'s/\r$//')

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

我还稍微简化了命令。在最近 Windows 10 次更新中,默认情况下路径 /mnt/c/Windows/System32 已包含在 $PATH WSL 变量中,因此只需 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命令确认当前目录正确

由于这个问题是从 2018 年初开始的,我的第一个想法是 Windows 10 build @user2023370 使用的还不是 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