如何为ubuntu 20的WSL2设置DISPLAY变量?

you*_*sef 5 command-line sed windows-subsystem-for-linux 20.04

我有一个带有 ubuntu 20 的 WSL2。在大多数帖子中,设置DISPLAY环境变量来访问 Windows X11 服务器是通过 WSL 本地主机地址进行的~/.bashrc

$ export DISPLAY=$(awk '/nameserver / {print $2; exit}' /etc/resolv.conf 2>/dev/null):0
Run Code Online (Sandbox Code Playgroud)

或者

$ export DISPLAY=$(cat /etc/resolv.conf |grep nameserver| sed 's/nameserver //'):0
Run Code Online (Sandbox Code Playgroud)

但是,这些命令将找到与主机 localhost 不同的 WSL2 计算机本地主机 IP。

对于我来说,为了使 xlaunch X11 服务器正常工作,我必须DISPLAY在每次使用 cmd 命令更改主机本地主机 IP 时进行设置ipconfig

有没有办法DISPLAY在 WSL2 启动之前设置为主机 localhost。例如,通过windows%USERPROFILE%\.wslconfig文件。

Not*_*1ds 5

请注意,这个问题有点(但并非完全)过时。现在这个问题有多个答案,具体取决于您的 Windows 版本和 DNS 设置。

为了完整起见,我还将介绍 WSL1,即使问题本身是在询问 WSL2。

  • WSL2

    • 哪些内容在 Windows 10 中不起作用(以及原因)

      在 WSL2 下运行 Ubuntu 的 Windows 10 中,您必须使用第三方 X 服务器才能运行图形应用程序。由于该 X 服务器在Windows (而不是 Ubuntu)中运行,因此它位于单独的网络上并且需要 IP 地址。

      在 Windows 10 上,以下操作不起作用

      export DISPLAY=:0.0
      # or export DISPLAY=:0
      
      Run Code Online (Sandbox Code Playgroud)
    • Windows 10 使用 mDNS 和 WSL 的 DNS 解析器:

      我通常使用并推荐:

      export DISPLAY=$(hostname).local:0
      
      Run Code Online (Sandbox Code Playgroud)

      根据我在 Stack Overflow 上关于该主题的文章,这使用 mDNS 来获取正确的地址。

      请注意,这假设您使用内置的 WSL DNS 解析器。如果您使用自己的 DNS 设置覆盖此设置,则它可能不起作用,因为您的 DNS 服务器可能不知道 Windows 主机的正确 IP 地址。在这种情况下,请继续...

    • 具有自定义 DNS 解析器的 Windows 10:

      如果您更改了/etc/resolv.con,那么 mDNS 可能无法工作。在这种情况下,请尝试@ChaiAng 的回答中的技术。即使不使用 WSL 的解析器,它也应该可以工作。但是,它有点慢(对我来说大约 2 秒),所以我不建议将它放在启动文件中,例如~/.bashrc.

    • 使用 WSLg 的 Windows 11:

      在 Windows 11 下,WSL2 可以使用 WSLg 功能运行 GUI 应用程序。它与 WSL 本身在同一网络空间中运行,因此在 Windows 11 下,我们回到以下正确DISPLAY设置:

      export DISPLAY=:0
      
      Run Code Online (Sandbox Code Playgroud)

      请注意,这是由 WSL 在 Ubuntu/WSL2 会话中自动为您设置的/init,因此除非在某些特殊情况下,否则没有任何理由手动设置它。

  • WSL1

    • 对于 Windows 10 和 11:

      在 WSL1 下,Ubuntu 本身与 Windows 运行在同一网络下,因此在这种情况下,您将使用:

      export DISPLAY=:0
      
      Run Code Online (Sandbox Code Playgroud)

      请注意,无论您运行的是 Windows 10 还是 11,您都需要具有 WSL1 的第三方 X 服务器。仅在 WSL2 下支持 WSLg。


cup*_*cup 2

只需使用

export DISPLAY=:0.0
Run Code Online (Sandbox Code Playgroud)

你可以测试一下xeyes。如果你没有xeyes

sudo apt install x11-apps
Run Code Online (Sandbox Code Playgroud)


小智 1

以下内容对我有用。

$ export DISPLAY=$(host `hostname --long` | grep -oP '(\s)\d+(\.\d+){3}' | tail -1 | awk '{ print $NF }' | tr -d '\r')
Run Code Online (Sandbox Code Playgroud)

这似乎找到了我的 X 窗口应用程序运行所需的 IP 地址。