Выполнение команд оболочки из программы, запущенной в WINE

У меня есть программа Windows, работающая в Linux с использованием WINE.

Как я могу вызвать команды оболочки Linux из программы Windows?

Ответ 1

Изменить: 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 туда, где вы его установили.

Ответ 2

Попробуйте это (запускает калькулятор Gnome в моей системе Mint Linux):

wineconsole cmd

... и с винной консоли:

/bin/sh gcalctool

В этом общем принципе вы также можете открывать документы и ассоциировать файлы с помощью приложения linux, редактируя винный реестр. В этом разделе есть раздел об этом в FAQ:

6.6.3 Как связать родную программу с типом файла в Wine?

Итак, вы должны иметь возможность писать сценарии оболочки и называть их ОК.

Ответ 3

С новыми версиями 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 не будет выполнен.

Ответ 4

Попробуйте (где ваша программа - это программа linux/unix, которую вы хотите исполнить в вине)

ln -s /path/to/yourprogram /path/to/wineprefix/drive_c/windows/system32/yourprogram

Вот как я получил работу java.

Ответ 5

для меня первое найденное мной решение на этом сайте работало - связать расширение с винторезцем, а программа просмотра gnome по умолчанию запускается из вина при нажатии на файл в винной проводнике (или в других приложениях Windows).

Предыдущее решение со сценариями оболочки, работающее в Wine 1.4, не работает с вином 1.6.

Однако проблема, которую я заметил, заключается в том, что имена в кодировке Windows не преобразуются в локали Linux, что препятствует этому работать, например, Названия русских каталогов

Ответ 6

Например:

Z:\bin\ls

Но, может быть, вы ищете скорее что-то вроде http://gnuwin32.sourceforge.net/, которое вы будете устанавливать в винные "окна"? Или уже упомянутый cygwin.

Ответ 7

Оболочка script, которая была указанная в FAQ по WineHQ, может быть слегка изменена, например:

#!/bin/bash
WFILE=$(echo -E $2)
FILE=$(wine winepath $WFILE)
$1 $FILE

Остальное работает так же, как описано в FAQ.

Ответ 8

Мне нравится Far Commander, который работает под wine, поэтому я установил эти два сценария:

  • Запуск приложений Linux из окон

C:\Windows\xt.bat

start /unix /usr/bin/xterm -e %*
  1. Чтобы открыть файлы в Linux из винной среды (Far):

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.

Ответ 9

Как вызвать программу Linux из программы Wine - пять точек с точки зрения API.

1. Правильный 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.

2. Путь к исполняемому файлу

Вероятно, необходимо указать полный (или относительный) путь к исполняемому файлу (например, /bin/bash), так как процесс Wine не наследует переменную среды PATH из родительского процесса Linux. Обратите внимание, что текущий диск в процессе Wine сопоставляется с корневой папкой Linux по умолчанию, поэтому нет необходимости указывать букву диска. То есть /bin/bash работает только, но не bash.

Другой способ - изменить переменную среды PATH в Вине соответственно или изменить текущий каталог.

Если путь содержит символы, отличные от ASCII, - в качестве аргумента CreateProcessA - путь должен быть в языковой среде Wine и в соответствии с переменной среды LANG; см. также ответ Евгения в этом разделе, а также сообщение на форуме, как установить кодировку для использования с не-Unicode-приложением в Wine. Для CreateProcessW путь должен быть в UTF-16 в любом случае.

3. Исполняемый формат

Исполнение 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.

4. Нет ожидания

Родительский процесс Wine не может ждать (например, через WaitForSingleObject) в дочернем Linux-процессе, так как он не снабжен дескриптором дочернего процесса - это всего лишь 0. См. bugreport: CreateProcess не устанавливает hProcess правильно при запуске Linux-программы (Status: CLOSED WONTFIX).

5. Разница в перенаправлении труб

Возможно, это ошибка в Wine, но родительский процесс должен закрыть дескрипторы std, которые передаются в CreateProcess, непосредственно перед закрытым концом труб. В Windows эти дескрипторы могут быть закрыты сразу после завершения функции CreateProcess. По MSDN эти дескрипторы могут быть сразу закрыты (см. CreateProcess function):

Ручки в STARTUPINFO или STARTUPINFOEX должны быть закрыты CloseHandle, когда они больше не нужны.

В Wine 2.0.1 в этом случае канал в дочернем Linux-процессе будет немедленно закрыт. Но не в случае дочернего процесса Windows.