如何优雅地创建一个 Windows 快捷方式来启动 X 下的 WSL 程序

How to elegantly create a Windows shortcut that starts a WSL program under X

我很难通过 Windows 任务栏上的按钮从 VcXsrv 下的 WSL 安装中启动 xfce4-terminal。完成后,除了 xfce4-terminal,我不想要任何 DOS box/console/terminal。我有它的工作,但男人是丑陋的。有人有更简洁的方法吗?

这是我的工作:我在桌面上用这个目标创建了一个 windows 快捷方式(全部在一行中,为了便于阅读,这里用换行符分隔):

C:\Windows\System32\wscript.exe
    \wsl$\Ubuntu-20.04\home\peter\bin\windows\startTerminal.vbs

startTerminal.vbs 的灵​​感来自 10 Ways To Run Batch Files Silently And Hide The Console Window • Raymond.CC(少数不需要为此安装单独程序的解决方案之一!)它包含:

CreateObject("Wscript.Shell").Run "C:\Windows\System32\wsl.exe -u peter --exec /home/peter/bin/windows/startTerminal.sh",0,True

startTerminal.sh包含:

export DISPLAY=localhost:0.0
xfce4-terminal --command=/bin/zsh

显然需要设置 DISPLAY,即使我在 ~/.zshrc 中设置了 DISPLAY 环境。 wsl.exe 显然不会那样做,除非你 运行 登录 shell。

所有这些都正常工作后,我可以将我的快捷方式拖到任务栏并在那里单击它。

我数3,三个个文件合作实现这个简单的目标?我可以在不安装外部程序的情况下将其限制为一两个吗?

我通过以下方式删除了对 startTerminal.sh 文件的需求:

正在编辑 startTerminal.vbs 以包含:

CreateObject("Wscript.Shell").Run "C:\Windows\System32\wsl.exe -u peter bash -l -c xfce4-terminal",0,True

然后我创建了一个 ~/.bash_profile 来设置 $DISPLAY 变量,这可能无论如何都应该完成:

$ cat .bash_profile
if [ -z "$DISPLAY" ]; then 
    export DISPLAY=:0
fi

现在有了快捷方式和启动它的 startTerminal.vbs。还是不太优雅...

是的,我认为您可以在一个快捷方式文件中完成我的工作。我将分享对我有用的东西,然后你必须 fiddle 为你的程序。

尝试将所有命令放入快捷方式 link 文件的目标部分。

第 1 步。右键单击桌面,然后单击新建,然后单击快捷方式,然后将其命名为 (LaunchXFCE4)

第 2 步。右键单击 LaunchXFCE4 select 属性

第 3 步。在“目标”部分输入所有启动序列

步骤 4. 右键单击​​ LaunchXFCE4 select 固定到任务栏

我在 WSL 2 上启动 Emacs 27.1,在 Windows 10 上启动 Ubuntu 20.10,使用此代码,也许您可​​以修改。

C:\Windows\System32\wsl.exe --distribution Ubuntu20 bash -c "export DISPLAY=$(ip route | awk '{print ; exit}'):0 && export LIBGL_ALWAYS_INDIRECT=1 && export XCURSOR_SIZE=16 && setsid emacs"

第一个导出显示与您的 localhost:0.0 相似,因此更换它或尝试我的。也许你的 xfce4 取代了我的 emacs。阅读 this post 关于双 & 号的内容。所以可能这个

C:\Windows\System32\wsl.exe --distribution Ubuntu20 bash -c "export DISPLAY=localhost:0.0 && export LIBGL_ALWAYS_INDIRECT=1 && export XCURSOR_SIZE=16 && setsid xfce4-terminal --command=/bin/zsh"

请注意,我的 VcXsrv 在 windows 启动时通过在我的 C:\Users\USERNAME\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup.

中放置 config.xlaunch 的快捷方式启动

顺便说一下,根据他们的 blog

,微软将在几个月内为 WSL 提供 GUI

GUI app support in WSL is becoming a reality! We are getting closer to an initial preview and happy to announce a preview release for Windows Insiders within the next couple of months.

在尝试了@Saj 的答案后,我得到了以下结果:

C:\Windows\System32\wsl.exe --distribution Ubuntu-20.04 bash -c "export DISPLAY=$((route.exe print | Select-String 0.0.0.0 | select -first 1) -Split "\s+" | select -Index 4):0.0 && export LIBGL_ALWAYS_INDIRECT=1 && setsid emacs"

请注意,我的问题是无法在括号内使用 bash 命令 (grep, awk)

环境:WSL2 Windows 10