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

Как запустить исполняемый файл Windows из WSL (Ubuntu) Bash

Наряду с обновлением Windows 10 Anniversary для летнего 2016 года появилась возможность запускать двоичные файлы ubuntu в новой подсистеме Windows для Linux (WSL), "облегченной" виртуализированной подсистема.

К сожалению, запуск C:\Windows\System32\bash.exe, другой bash двоичный файл ELF запускает процесс внутри WSL, откуда вы не можете убежать! Вы можете запускать только другие исполняемые файлы ELF.

Итак, как я могу выполнить *.exe файлы из Windows Bash? [1]

[1] Вопрос также задан в официальном официальном "Репорте поддержки GH Microsoft" .

4b9b3361

Ответ 1

Нативное решение

Официальное решение, предоставленное Обновление предварительного просмотра Windows 10 (14951), основано на почти забытом binfmt_msc Линукс для запуска двоичных файлов. Команда регистрации для 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

Нельзя, чтобы любой исполняемый файл должен находиться в файловой системе Windows (DrvFs), а не в файловой системе Linux (VolFs), чтобы наследовать надлежащий рабочий каталог Windows.

Альтернатива cbwin

Пока вы не получите последнюю сборку, проект cbwin предлагает обходное решение, установив 3 новые команды linux внутри WSL:

  • wcmd: вызовите win-executable через cmd.exe.
  • wrun: синхронно вызовите win-исполняемый файл с CreateProcess и подождите, чтобы умереть (не используя cmd.exe).
  • wstart: запустить отдельную (асинхронную) команду (с использованием cmd.exe).

Чтобы использовать их, вы должны:

  • Установить cbwin:
    • в вашей обычной файловой системе Windows (где-то в вашем %PATH%) будет установлен новый outbash.exe, плюс
    • 3 linux-команды в файловой системе WSL.
  • Используйте этот outbash.exe (где бы вы его не установили), чтобы запустить WSL, NOT C:\Windows\System32\bash.exe!
  • Префикс любых win-исполняемых файлов с одной из этих команд, например. wrun notepad.

Совет. Если исполняемый файл, запущенный с помощью wcmd или wrun, порождает всех детей, они сохраняются только до тех пор, пока исполняемый файл не останется в живых.

Другими словами, попытка запуска notepad.exe с помощью wcmd не будет работать, потому что блокнот будет убит сразу после его запуска. Используйте wrun (синхронно) или wstart (асинхронно) в этом случай.

Ответ 2

В Windows 10 Creators Update (сборка 1703, апрель 2017 г.) это поддерживается изначально. Теперь вы можете запускать бинарные файлы Windows из Linux...

linux to windows

...и наоборот:

windows to linux

Для получения дополнительной информации см. Ссылку выше.

Ответ 3

Хотя запуск .exe из командной строки работает, при запуске из скажем PHP через exec() я не мог заставить это работать. Добавление /init, однако, работает. Это мой рабочий файл /usr/local/bin/convert для GraphicsMagick, установленный в Windows:

#!/bin/sh
/init "$(ls /mnt/c/Program*/GraphicsMagick*/gm.exe|tail -1)" convert "[email protected]"