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文件。
请注意,这个问题有点(但并非完全)过时。现在这个问题有多个答案,具体取决于您的 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。
只需使用
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 地址。