【问题标题】:New defined environment varaibles can't be seen outside of WSL2?在 WSL2 之外看不到新定义的环境变量?
【发布时间】:2021-10-27 00:33:01
【问题描述】:

在 WSL2 中,使用 ubuntu 发行版,我在 /etc/profile 中定义了一个新变量(我也尝试过 ~/.bashrc 和 /etc/environment)

export JDK_17_0=/home/scaventz/sdk/jdk-17

然后source /etc/profile

然后我尝试通过在 Windows 中使用 Intellij IDEA 创建一个 Java 项目来获取此变量(该项目本身当然位于 WSL2 中):

public class Main {
    public static void main(String[] args) {
        String prop = "JDK_17_0";
        String jdk = System.getProperty(prop);
        if (jdk == null) {
            jdk = System.getenv(prop);
        }
        System.out.println(jdk);
    }
}

我得到一个空值。

这似乎是与 WSL2 相关的问题,有什么解决方法吗?

【问题讨论】:

  • 什么意思:项目本身位于WSL2中?
  • 抱歉没有描述清楚,表示我在WSL2中创建了一个java项目,并在Windows中用IDEA打开。
  • 导出环境变量的问题在于它只在您的终端会话中持续存在,我认为source /etc/profile 也是如此。你说你把它加到了~/.bashrc?您可以从 WSL2 终端回显该变量吗?
  • 您是否在 WSL2 终端中启动您的应用程序?
  • @scaventz:环境变量由 child 进程传递继承。您必须安排您的 Java 程序作为设置变量的 bash 进程的子进程运行。

标签: java shell environment-variables wsl-2


【解决方案1】:

是的,这是意料之中的,是的,有一种解决方法。默认情况下,导出的 WSL 环境变量不会back传播到 Windows 环境。您可以通过(从 WSL/Bash 开始)看到相同的行为:

> export JDK_17_0=/home/scaventz/sdk/jdk-17
> powershell.exe
PS > $env:JDK_17_0

...不会返回任何内容。

但 WSL 确实具有 WSL 和 Windows 进程之间sharing environment variables 的互操作功能。

重复我们之前的例子:

> export JDK_17_0=/home/scaventz/sdk/jdk-17
> WSLENV=JDK_17_0 powershell.exe
PS > $env:JDK_17_0
/home/scaventz/sdk/jdk-17

请注意,这不会直接修改 Windows 中的 System 环境变量;它只是将一个新变量注入powershell.exe 进程。因此,您应该能够通过以相同方式调用 Intellij IDEA Windows 可执行文件(如果它不在 Windows 路径中,您可能需要完整的 /mnt/c/... 路径)来做同样的事情。由于 Intellij 启动了 Windows Java 可执行文件,因此为 Intellij 进程设置的环境变量应该传播到 Java 进程。

虽然我目前没有该特定设置,但我至少能够通过在上面的 PowerShell 会话中启动 VSCode 来确认它。在 VSCode 内部,环境变量仍然可用。

当然,还要注意 WSL/Linux 和 Windows 之间路径结构的差异。仅仅因为你可以将/home/scaventz/sdk/jdk-17 传递给在 Windows 上运行的 Java 并不意味着它会理解它。 Windows 上的 Java 理解 Windows 路径结构。它无法直接访问 /home/scaventz/sdk/jdk-17 中的任何内容。

我意识到您并没有尝试在该示例中访问文件系统,但我认为这对您来说是未来的一步,因为您正在传递路径。因此,您可能希望将 translatable path option 用于 WSLENV:

> export JDK_17_0=/home/scaventz/sdk/jdk-17
> WSLENV=JDK_17_0/p powershell.exe
PS > $env:JDK_17_0
\\wsl$\Ubuntu\home\scaventz\sdk\jdk-17 # Or \\wsl$\whatever_your_distribution_is_named\...

旁注:

这似乎是一个与 WSL2 相关的问题

公平地说,并非如此。按照您描述事物的方式,如果您从 PowerShell 执行此操作,您会看到相同的行为。尝试在 PowerShell 中设置相同的环境变量,然后从 Windows 开始菜单启动 Intellij IDEA。它也无法访问该变量。

只有在父进程启动新进程时,您才有希望将变量传递给该新进程。

除非您使用 PowerShell 修改系统变量 like so。请注意,如果需要,您也可以通过 WSL 的 Interop with PowerShell 来实现。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-08-25
    • 2021-10-20
    • 2019-03-01
    • 2016-07-30
    • 2018-02-17
    • 2015-05-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多