web-dev-qa-db-ja.com

WSL(Ubuntu)BashからWindows実行可能ファイルを実行する方法

2016年夏のWindows 10 Anniversary updateに加えて、ubuntu新しい Linux用Windowsサブシステム(WSL) 、「軽量」仮想化サブシステム内のバイナリ。

残念ながら、C:\Windows\System32\bash.exe、別のbash ELFバイナリを起動すると、WSL内でプロセスが開始され、そこからエスケープすることはできません。他のELFバイナリのみを起動できます。

それでは、Windows Bashから*.exeファイルを実行するにはどうすればよいですか?[1]

[1] Microsoftの「公式」GHサポートリポジトリ でも質問されています。

26
ankostis

ネイティブソリューション

Windows 10 Insider Preview Update(14951) で提供される公式ソリューションは、ほとんど忘れられている binfmt_msc バイナリを起動するためのLinux機能。 binfmt_miscの登録コマンドは次のようになります(/initは仮のbinfmt_misc win-executablesの「インタープリター」です)。

Sudo echo ":WSLInterop:M::MZ::/init:" > /proc/sys/fs/binfmt_misc/register

そして、通常のプログラムのようにwin-executableが起動します。

$ export PATH=$PATH:/mnt/c/Windows/System32
$ notepad.exe
$ ipconfig.exe | grep IPv4 | cut -d: -f2
$ ls -la | findstr.exe foo.txt
$ cmd.exe /c dir

Win-executableがウィンドウ(DrvFs)ファイルシステムにある必要があります-Linuxのファイルシステム(VolFs)にない-適切に継承するには- Windows作業ディレクトリ。

cbwinの代替

最新のビルドを取得するまで、プロジェクト cbwin は、WSL内に3つの新しいLinuxコマンドをインストールすることで回避策を提供します。

  • wcmdcmd.exeを介してwin-executableを呼び出します。
  • wrun:win_executableをCreateProcessと同期して呼び出し、死ぬまで待機します(cmd.exeを使用しない)。
  • wstart:(cmd.exeを使用して)分離(非同期)コマンドを起動します。

それらを使用するには、以下を行う必要があります。

  1. インストールcbwin
    • 新しいoutbash.exeが通常のWindowsファイルシステム(%PATH%のどこかに)にインストールされ、さらに
    • wSLファイルシステムの3つのlinux-commands。
  2. このoutbash.exe(インストールした場所)を使用して、C:\Windows\System32\bash.exeではなくWSLを起動します。
  3. これらのコマンドのいずれかでwin-executablesの前に付けます。 wrun notepad

ヒント:wcmdまたはwrunで起動された実行可能ファイルが子を生成する場合、これらは実行可能ファイルが生きている限り存続します。

つまり、notepad.exewcmdで起動しようとしても機能しません。これはnotepadが起動直後に強制終了されるためです-wrunを使用する(同期的に)またはwstart(非同期)この場合。

22
ankostis

Windows 10 Creators Update (ビルド1703、2017年4月)では、これはネイティブにサポートされています。 LinuxからWindowsバイナリを実行できるようになりました...

linux to windows

...およびその逆:

windows to linux

詳細については、上記のリンクされた記事を参照してください。

24
Andrew Mao

コマンドラインから.exeを実行すると動作しますが、say PHP via exec()から実行すると動作しませんでしたが、/initを追加しても動作します。は、WindowsにインストールされているGraphicsMagick用の私の作業/usr/local/bin/convertファイルです。

#!/bin/sh
/init "$(ls /mnt/c/Program*/GraphicsMagick*/gm.exe|tail -1)" convert "$@"
2
chx