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

use*_*370 5 bash environment-variables windows-10 windows-subsystem-for-linux

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

WSLENV在通常的 Windows“环境变量”控制面板中添加了一个新的系统变量,将其设置为USERPROFILE/u. 然后我从任务栏打开 Ubuntu,然后输入:

$ echo $USERPROFILE
Run Code Online (Sandbox Code Playgroud)

...但什么也没有返回。

Dmi*_*try 5

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

$ cd /mnt/c/
$ mkdir Windows_NT
$ tmpvar=`/mnt/c/Windows/System32/cmd.exe /C "echo %OS%"`
$ echo $tmpvar
Windows_NT
Run Code Online (Sandbox Code Playgroud)

一切似乎都很好,但不是:

$ cd $tmpvar
: No such file or directory
Run Code Online (Sandbox Code Playgroud)

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

$ ls -ld $tmpvar
ls: cannot access 'Windows_NT'$'\r': No such file or directory
Run Code Online (Sandbox Code Playgroud)

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

tmpvar=$(cmd.exe /C echo %OS%|sed $'s/\r$//')
Run Code Online (Sandbox Code Playgroud)

或者

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

我还稍微简化了命令。在最近的 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
Run Code Online (Sandbox Code Playgroud)

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


Gáb*_*mre 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
Run Code Online (Sandbox Code Playgroud)

我还没有检查过WSLENV,但上面的应该可以工作。但远谈不上优雅。