WSL从Windows运行linux而不会产生一个cmd窗口

我有一个cmd运行WSL bash。 我什么都不用,它只是挂在那里,以保持WSL系统活着。

当我启动X应用程序时:

bash -c "DISPLAY=:0 xmessage hello &" 

我得到这个结果:

在这里输入图像说明

我可以没有任何问题地closures命令窗口,但这很烦人。

如何运行命令而无需每次都得到这个cmd窗口?

Solutions Collecting From Web of "WSL从Windows运行linux而不会产生一个cmd窗口"

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

 wscript .\runHidden.vbs bash -c "DISPLAY=:0 xmessage 'hello, world'" 

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

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

 wscript .\runHidden.vbs bash # hidden helper instance for servicing background commands 

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

 wscript .\runHidden.vbs bash -c "DISPLAY=:0 xmessage 'hello, world' &" 

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 

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

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

请注意,脚本的使用不限于控制台应用程序:甚至GUI应用程序也可以隐藏在其中。

还有一个简单的解决方案,但它需要一个外部可执行文件。 它没有依赖关系,并被GitHub上的推荐。

你可以通过run.exe启动bash:run.exe bash.exe -c“<任何Linux命令>”。 (run.exe可以在这里找到: http : //www.straightrunning.com/projectrun/ )

在搜索路径上run ,你可以打电话

run bash -c "DISPLAY=:0 xmessage hello"

所以我现在只是做了这个解决方法。 我真的希望有一个比这更好的方法,但是这里有:

在纯粹保持WSL活着的命令提示符下,我运行了以下脚本:

wsl_run_server

 #!/bin/bash set -e nc -kl 127.0.0.1 15150 | sh 

然后我有这个命令在后台执行命令:

wsl_run_background_command

 if ! pidof -x bin/wsl_run_server; then echo wsl_run_server isnt running! exit 1 fi echo \($@\) \& | nc localhost 15150 

从窗口我然后打电话:

 bash -c "DISPLAY=:0 ~/bin/wsl_run_command xmessage hello"