Выполнить команды оболочки из программы, запущенной в WINE - PullRequest
12 голосов
/ 14 мая 2011

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

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

Ответы [ 9 ]

8 голосов
/ 21 ноября 2011

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

wineconsole cmd

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

/bin/sh gcalctool

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

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

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

7 голосов
/ 14 апреля 2015

В более новых версиях 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 голосов
/ 02 апреля 2012

Try (где yourprogram - это программа linux / unix, которую вы хотите запустить в Wine)

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

Вот как я начал работать с Java.

2 голосов
/ 07 августа 2017

Как вызвать программу 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 :

Обратите внимание, что это изменение необходимо будет вносить при каждом обновлении Wine, поскольку оно будет отменяться при каждом обновлении wineprefix.

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

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

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

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

3.Формат исполняемых файлов

Исполняемые файлы Linux в формате общих объектов не могут быть выполнены из Wine.См .: Исполняемые файлы против общих объектов и Как выполнять сценарии оболочки из 32-битного Wine на 64-битном Linux .Например, /bin/dash может быть "ELF 64-битным общим объектом LSB" (см. Вывод file /bin/dash) и не может быть выполнен из 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. См. Отчет об ошибке: CreateProcess неправильно устанавливает hProcess при запуске программы для Linux (Статус: CLOSED WONTFIX).

Тем не менее, родительский процесс может косвенно ожидать дочерний процесс, блокируя чтение в определенном канале, если дочерний процессиспользует стандартный вывод (см. также ниже).

5.Разница в перенаправлении каналов

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

Дескрипторы в STARTUPINFO или STARTUPINFOEX должны быть закрыты с помощью CloseHandle, когда они больше не нужны.

В Wine 2.0.1 соответствующий канал в дочернем процессе Linux в этом случае будет немедленно закрыт, а дочерний процесс преждевременно остановится .Но не в случае дочернего процесса Windows.

2 голосов
/ 07 мая 2014

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

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

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

1 голос
/ 23 января 2013

Например:

Z:\bin\ls

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

1 голос
/ 15 мая 2011

Редактировать: комментарий user1182474 правильный;Wine не изолирует программы, которые он запускает.(Он пытается это скрыть, но не очень тщательно.) Я не смог использовать Google.Комментарий Psen ниже является более правильным и ссылается на FAQ.(Обратите внимание, что для того, чтобы это работало, вам может потребоваться доступ к каталогу программы через сопоставление дисков Wine. Или см. Ответ Anonymous Replier.)

== Старый ответ ==

Wine изолирует программы, которые он запускает.Приложения, если все работает как задумано, представлены в среде, неотличимой от Windows.К сожалению, для ваших целей это означает, что вы не можете получить доступ к функциям хост-ОС (Linux).Я имею в виду, что вы могли бы исправить это для Wine, но у меня сложилось впечатление, что это будет больше работы, чем стоит.

Есть надежда!Cygwin - это Unix-подобная среда для Windows.Вы можете установить Cygwin в Wine и использовать Cygwin для запуска сценария оболочки.(По-видимому, установка с помощью 'winetricks cygwin' является самой простой). Вызвать оболочку bash Cygwin (внутри некоторой программы Wine) следующим образом:

c:\cygwin\bin\bash  myscript

Конечно, измените c: \ cygwin на то место, где вы его устанавливаете.

0 голосов
/ 05 апреля 2017

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

  1. Для запуска приложений Linux из Windows

C: \ windows \ xt.bat

start /unix /usr/bin/xterm -e %*
Чтобы открыть файлы в Linux из среды Wine (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.

0 голосов
/ 27 ноября 2014

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...