WSL从Windows运行linux而不生成cmd窗口

dav*_*vvs 10 windows bash ubuntu windows-subsystem-for-linux

我在一个cmd中运行WSL bash.我不会将它用于任何东西,它只是挂在那里以保持WSL系统的活力.

当我启动X应用程序时:

bash -c "DISPLAY=:0 xmessage hello &"
Run Code Online (Sandbox Code Playgroud)

我得到这个结果:

在此输入图像描述

我可以毫无问题地关闭命令窗口,但这很烦人.

如何在不每次都获取此cmd窗口的情况下运行命令?

mkl*_*nt0 15

这是一个更简单的解决方案,需要基于WSH的帮助程序脚本,但是:

wscript .\runHidden.vbs bash -c "DISPLAY=:0 xmessage 'hello, world'"
Run Code Online (Sandbox Code Playgroud)

要应用@davv自己的启动后启动技术,以避免bash每次都创建一个新实例:

一次性操作(例如,在启动时):启动隐藏的,保持打开的bash窗口.这产生了 2个 bash进程:拥有控制台窗口的 Windows bash.exe进程和WSLbash进程(由WSLinit单例拥有),然后可用于服务后台命令.

wscript .\runHidden.vbs bash # hidden helper instance for servicing background commands
Run Code Online (Sandbox Code Playgroud)

对于每个X Window启动命令:终止每个命令,&使其由异步隐藏的WSLbash实例运行,而不保持调用实例处于活动状态: bash

wscript .\runHidden.vbs bash -c "DISPLAY=:0 xmessage 'hello, world' &"
Run Code Online (Sandbox Code Playgroud)

runHidden.vbs 源代码:

' Simple command-line help.
select case WScript.Arguments(0)
case "-?", "/?", "-h", "--help"
  WScript.echo "Usage: runHidden executable [...]" & vbNewLine & vbNewLine & "Runs the specified command hidden (without a visible window)."
  WScript.Quit(0)
end select

' Separate the arguments into the executable name
' and a single string containing all arguments.
exe = WScript.Arguments(0)
sep = ""
for i = 1 to WScript.Arguments.Count -1
  ' Enclose arguments in "..." to preserve their original partitioning.
  args = args & sep & """" & WScript.Arguments(i) & """"
  sep = " "
next

' Execute the command with its window *hidden* (0)
WScript.CreateObject("Shell.Application").ShellExecute exe, args, "", "open", 0
Run Code Online (Sandbox Code Playgroud)

即使从GUI应用程序启动(例如通过Run调用的对话框Win+R),也不会显示控制台窗口.

如果你已经将系统配置为默认执行.vbs脚本wscript.exe(wscript //h:wscript /s),你可以runHidden.vbs直接调用,如果你把它放在你%PATH%的文件名(root)中:runHidden ....

请注意,脚本的使用不仅限于控制台应用程序:甚至可以使用它隐藏GUI应用程序.