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サポートリポジトリ でも質問されています。
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 は、WSL内に3つの新しいLinuxコマンドをインストールすることで回避策を提供します。
wcmd
:cmd.exe
を介してwin-executableを呼び出します。wrun
:win_executableをCreateProcess
と同期して呼び出し、死ぬまで待機します(cmd.exe
を使用しない)。wstart
:(cmd.exe
を使用して)分離(非同期)コマンドを起動します。それらを使用するには、以下を行う必要があります。
outbash.exe
が通常のWindowsファイルシステム(%PATH%
のどこかに)にインストールされ、さらにoutbash.exe
(インストールした場所)を使用して、C:\Windows\System32\bash.exe
ではなくWSLを起動します。wrun notepad
。ヒント:wcmd
またはwrun
で起動された実行可能ファイルが子を生成する場合、これらは実行可能ファイルが生きている限り存続します。
つまり、notepad.exe
をwcmd
で起動しようとしても機能しません。これはnotepadが起動直後に強制終了されるためです-wrun
を使用する(同期的に)またはwstart
(非同期)この場合。
Windows 10 Creators Update (ビルド1703、2017年4月)では、これはネイティブにサポートされています。 LinuxからWindowsバイナリを実行できるようになりました...
...およびその逆:
詳細については、上記のリンクされた記事を参照してください。
コマンドラインから.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 "$@"