У меня есть программа Windows, работающая в Linux с использованием WINE.
Как я могу вызвать команды оболочки Linux из программы Windows?
У меня есть программа Windows, работающая в Linux с использованием WINE.
Как я могу вызвать команды оболочки Linux из программы Windows?
Изменить: user1182474 комментарий правильный; Вино не изолирует программы, которые он запускает. (Он пытается скрыть это, но не очень тщательно.) Я полностью не смог использовать Google. Комментарий Psen ниже правилен и содержит ссылки на часто задаваемые вопросы. (Обратите внимание, что для этого вам может потребоваться доступ к каталогу программы через сопоставление винного диска. Или см. Ответ анонимного ответа.)
== Старый ответ ==
Wine изолирует программы, которые он запускает. Приложения, если все работает по назначению, представляют собой среду, неотличимую от Windows. К сожалению, для ваших целей это означает, что вы не можете получить доступ к функциям ОС хоста (Linux). Я имею в виду, что вы можете использовать Wine для этого, но у меня создается впечатление, что это будет больше работы, чем того стоит.
Есть надежда! Cygwin - это Unix-подобная среда для Windows. Вы можете установить Cygwin в Wine и использовать Cygwin для запуска вашей оболочки script. (Видимо, установка с помощью "winetricks cygwin" проще всего). Вызовите Cygwin bash shell (внутри некоторой программы Wine) следующим образом:
c:\cygwin\bin\bash myscript
Конечно, измените c:\cygwin туда, где вы его установили.
Попробуйте это (запускает калькулятор Gnome в моей системе Mint Linux):
wineconsole cmd
... и с винной консоли:
/bin/sh gcalctool
В этом общем принципе вы также можете открывать документы и ассоциировать файлы с помощью приложения linux, редактируя винный реестр. В этом разделе есть раздел об этом в FAQ:
6.6.3 Как связать родную программу с типом файла в Wine?
Итак, вы должны иметь возможность писать сценарии оболочки и называть их ОК.
С новыми версиями Wine (проверенными с помощью Wine 1.7.38) вы можете запустить программу Linux из Wine в следующем порядке (здесь, например, для запуска gedit):
wineconsole cmd
... и с этой винной консоли:
start /unix /usr/bin/gedit
Если вы хотите запустить программу Linux непосредственно из Windows-приложения, для меня работала следующая строка:
cmd /c start /unix /usr/bin/gedit
Чтобы протестировать это, вы можете напрямую позвонить на консоль Linux:
wine cmd /c start /unix /usr/bin/gedit
Важно отметить, что для программы, которую вы хотите запустить, должен быть установлен бит исполняемого бита, иначе вызов из Wine не будет выполнен.
Попробуйте (где ваша программа - это программа linux/unix, которую вы хотите исполнить в вине)
ln -s /path/to/yourprogram /path/to/wineprefix/drive_c/windows/system32/yourprogram
Вот как я получил работу java.
для меня первое найденное мной решение на этом сайте работало - связать расширение с винторезцем, а программа просмотра gnome по умолчанию запускается из вина при нажатии на файл в винной проводнике (или в других приложениях Windows).
Предыдущее решение со сценариями оболочки, работающее в Wine 1.4, не работает с вином 1.6.
Однако проблема, которую я заметил, заключается в том, что имена в кодировке Windows не преобразуются в локали Linux, что препятствует этому работать, например, Названия русских каталогов
Например:
Z:\bin\ls
Но, может быть, вы ищете скорее что-то вроде http://gnuwin32.sourceforge.net/, которое вы будете устанавливать в винные "окна"? Или уже упомянутый cygwin.
Оболочка script, которая была указанная в FAQ по WineHQ, может быть слегка изменена, например:
#!/bin/bash
WFILE=$(echo -E $2)
FILE=$(wine winepath $WFILE)
$1 $FILE
Остальное работает так же, как описано в FAQ.
Мне нравится Far Commander, который работает под wine, поэтому я установил эти два сценария:
C:\Windows\xt.bat
start /unix /usr/bin/xterm -e %*
C:\Windows\xdg.bat
cd >C:\windows\command\mypwd
start /unix /etc/init.d/winopen.sh %*
/etc/init.d/winopen.sh
#!/bin/sh
PWDF=`winepath -u 'C:\windows\command\mypwd'`
fromdos $PWDF
xdg-open $(winepath -u $(cat $PWDF)/$1)
Теперь я могу ввести в командной строке Far:
xt top
xdg SomeDocument.PDF
и получить результаты в среде Linux.
Как вызвать программу Linux из программы Wine - пять точек с точки зрения API.
PATHEXT
В новых версиях Wine (начиная с версии 2.0.1) необходимо добавить расширение пустое (то есть просто символ точки: .
) в список расширений исполняемого файла в PATHEXT
переменная среды. Без этого добавления сообщение об ошибке может сказать что-то вроде:
Can't recognize '/bin/bash' as an internal or external command, or batch script.
Чтобы исправить начальное значение PATHEXT
в реестре, можно использовать следующий фрагмент команд (для каждого WINEPREFIX
):
k='HKLM\System\CurrentControlSet\Control\Session Manager\Environment'
pathext_orig=$( wine reg query "$k" /v PATHEXT | tr -d '\r' | awk '/^ /{ print $3 }' )
echo "$pathext_orig" | grep -qE '(^|;)\.(;|$)' \
|| wine reg add "$k" /v PATHEXT /f /d "${pathext_orig};."
Этот код проверяет, а затем изменяет PATHEXT
, если он не содержит только элемент .
.
См. также: Как запустить собственные приложения из приложения Windows? в FAQ по WineHQ, NB:
Обратите внимание, что это изменение необходимо будет делать каждый раз, когда вы обновляете Вино, поскольку оно будет возвращено всякий раз, когда обновляется wineprefix.
Вероятно, необходимо указать полный (или относительный) путь к исполняемому файлу (например, /bin/bash
), так как процесс Wine не наследует переменную среды PATH
из родительского процесса Linux.
Обратите внимание, что текущий диск в процессе Wine сопоставляется с корневой папкой Linux по умолчанию, поэтому нет необходимости указывать букву диска. То есть /bin/bash
работает только, но не bash
.
Другой способ - изменить переменную среды PATH
в Вине соответственно или изменить текущий каталог.
Если путь содержит символы, отличные от ASCII, - в качестве аргумента CreateProcessA
- путь должен быть в языковой среде Wine и в соответствии с переменной среды LANG
; см. также ответ Евгения в этом разделе, а также сообщение на форуме, как установить кодировку для использования с не-Unicode-приложением в Wine. Для CreateProcessW
путь должен быть в UTF-16 в любом случае.
Исполнение Linux в формате общего объекта не может быть выполнено из Wine. Смотрите: Исполняемые файлы против общих объектов и Как выполнить сценарии оболочки из 32-разрядного Wine в 64-разрядной версии Linux, Например, /bin/dash
может быть "ELF 64-разрядным LSB-общим объектом" (см. Вывод file /bin/dash
) и не может быть exec из Wine в таком случае. В сообщении об ошибке говорится:
wine: Bad EXE format for Z:\bin\dash..
Can't recognize '/bin/dash' as an internal or external command, or batch script.
Родительский процесс Wine не может ждать (например, через WaitForSingleObject
) в дочернем Linux-процессе, так как он не снабжен дескриптором дочернего процесса - это всего лишь 0. См. bugreport: CreateProcess не устанавливает hProcess правильно при запуске Linux-программы (Status: CLOSED WONTFIX).
Возможно, это ошибка в Wine, но родительский процесс должен закрыть дескрипторы std, которые передаются в CreateProcess, непосредственно перед закрытым концом труб. В Windows эти дескрипторы могут быть закрыты сразу после завершения функции CreateProcess
. По MSDN эти дескрипторы могут быть сразу закрыты (см. CreateProcess function):
Ручки в STARTUPINFO или STARTUPINFOEX должны быть закрыты CloseHandle, когда они больше не нужны.
В Wine 2.0.1 в этом случае канал в дочернем Linux-процессе будет немедленно закрыт. Но не в случае дочернего процесса Windows.