Подтвердить что ты не робот

WSL запускает linux из окон без появления cmd-окна

У меня WSL bash работает в cmd. Я не использую его ни для чего, он просто висит там, чтобы поддерживать систему WSL.

Когда я запускаю X-приложения:

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

Получаю этот результат:

введите описание изображения здесь

Я могу закрыть окно команд без каких-либо проблем, но это довольно раздражает.

Как запустить команды без получения этого окна cmd каждый раз?

4b9b3361

Ответ 1

Вот более простое решение, требующее вспомогательного сценария WSH -based:

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

Чтобы применить собственную методику запуска @davv в фоновом режиме, чтобы каждый раз избегать создания нового экземпляра bash:

Единовременное действие (например, во время загрузки): запустить скрытое, остающееся открытым окно bash. Это порождает 2 процесса bash: процесс Windows bash.exe который владеет окном консоли, и процесс bash WSL (принадлежащий синглтону init WSL), который затем доступен для обслуживания фоновых команд.

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

Для каждой команды запуска X Window: Завершите каждую команду с помощью & чтобы она выполнялась скрытым экземпляром 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

Даже при запуске из приложения с графическим интерфейсом (например, через диалоговое окно " Run ", вызываемое с помощью Win+R), в этом окне консоли не отображается.

Если вы настроили свою систему на выполнение сценариев .vbs с wscript.exe по умолчанию (wscript//h:wscript/s), вы можете напрямую вызывать runHidden.vbs и, если вы поместите его в свой %PATH%, по имени файла только (root): runHidden...

Обратите внимание, что использование сценария не ограничивается консольными приложениями: даже приложения с графическим интерфейсом могут быть скрытыми.

Ответ 2

Есть еще одно простое решение, для которого требуется внешний исполняемый файл. Он не имеет никаких зависимостей и был рекомендован aseering на GitHub.

you can launch bash via run.exe: run.exe bash.exe -c "". (run.exe is available here: http://www.straightrunning.com/projectrun/, make sure you download the 64-bit version, the 32-bit version will not be able to find or run bash).

С run в поисковой PATH вы можете просто позвонить

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

Ответ 3

Итак, я только сделал это обходное решение. Я действительно надеюсь, что есть лучший способ, чем это, но здесь он идет:

В командной строке, которая живет только для того, чтобы сохранить WSL в живых, у меня есть этот script запуск:

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 \([email protected]\) \& | nc localhost 15150

из окон, которые я затем вызываю:

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

Ответ 4

Как насчет start/b bash -c "DISPLAY =: 0 xmessage hello"? Я что-то пропустил?