从 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
为了删除该字符,可以使用 sed 或 tr 额外处理输出:
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 即可。
现在,ls 和 cd 命令可以正常工作:
$ 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
我想通过 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
为了删除该字符,可以使用 sed 或 tr 额外处理输出:
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 即可。
现在,ls 和 cd 命令可以正常工作:
$ 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