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

时间:2016-12-19 15:16:01

标签: windows bash ubuntu windows-subsystem-for-linux

我在cmd中运行WSL bash。我不会将它用于任何事情,它只是挂在那里以保持WSL系统的活着。

当我启动X应用程序时:

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

我得到了这个结果:

enter image description here

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

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

4 个答案:

答案 0 :(得分:15)

这是一个更简单的解决方案,需要 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启动命令 :使用&终止每个命令,使其由隐藏的WSL bash实例运行< em>异步,而不保持调用 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对话框),也不会显示控制台窗口。

如果您已将系统配置为默认.vbs执行wscript.exe脚本,则可以直接调用wscript //h:wscript /s,如果您将其置于runHidden.vbs您的%PATH%,仅限文件名(root):runHidden ...

请注意,脚本的使用不仅限于 console 应用程序:甚至可以使用隐藏的GUI应用程序运行。

答案 1 :(得分:2)

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

  

你可以通过run.exe启动bash:run.exe bash.exe -c&#34;&lt;无论Linux命令&gt;&#34;。 (此处提供了run.exe:http://www.straightrunning.com/projectrun/

在搜索路径上使用run,您只需拨打

即可

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

答案 2 :(得分:1)

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

在纯粹为了保持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
从Windows获取

然后致电:

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

答案 3 :(得分:0)

运行命令背景

screen -dmS [name] [command]

示例

screen -dmS gui bash -c "DISPLAY=:0 xmessage hello"

在windows桌面上创建快捷方式(在wsl中运行)

wslusc screen -dmS gui bash -c "DISPLAY=:0 xmessage hello"