web-dev-qa-db-ja.com

WSLは、cmd-windowを生成せずにWindowsからLinuxを実行します

CmdでWSLbashを実行しています。私はそれを何にも使用していません。WSLシステムを存続させるためにそこにぶら下がっているだけです。

Xアプリケーションを起動すると:

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

私はこの結果を得る:

enter image description here

コマンドウィンドウを問題なく閉じることができますが、かなり面倒です。

毎回このcmdウィンドウを取得せずにコマンドを実行するにはどうすればよいですか?

11
davvs

これがより単純なソリューションであり、[〜#〜] wsh [〜#〜 ] ベースのヘルパースクリプト、ただし:

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

@davv独自のバックグラウンド起動手法を適用して、毎回新しいbashインスタンスが作成されないようにするには:

1回限りのアクション(例:起動時):非表示のオープンのままbashを起動します窓。これにより、2bashプロセスが生成されます:コンソールウィンドウを所有するWindowsbash.exeプロセス、およびWSL bashプロセス( WSL init singleton)が所有し、その後、バックグラウンドコマンドのサービスに使用できます。

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

すべてのXウィンドウ起動コマンド:各コマンドを&で終了してくださいinvokingbashインスタンスを存続させずに、非表示のWSL 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アプリから起動した場合でも(で呼び出されたRunダイアログを介してなど) Win+R)、これはコンソールウィンドウを表示しません。

デフォルトで.vbsを使用してwscript.exeスクリプトを実行するようにシステムを構成している場合(wscript //h:wscript /s)、runHidden.vbsを直接呼び出すことができ、それを%PATH%、ファイル名(ルート)のみ:runHidden ...

スクリプトの使用はconsoleアプリケーションに限定されないことに注意してください。GUIアプリケーションでさえ、スクリプトを使用して非表示で実行できます。

15
mklement0

別の簡単な解決策がありますが、外部実行可能ファイルが必要です。依存関係はなく、 GitHubでのaseering によって推奨されました。

run.exeを介してbashを起動できます:run.exe bash.exe -c "<whatever Linuxcommand>"。 (run.exeはここから入手できます: http://www.straightrunning.com/projectrun/ 、必ず64ビットバージョンをダウンロードしてください。32ビットバージョンは検索できません。 bashを実行します)。

検索パスにrunがあれば、

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

2
lorenz

だから私は今のところこの回避策を作った。私はこれよりも良い方法があることを本当に望んでいますが、ここにそれがあります:

純粋に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"
1
davvs