我有一个使用 WINE 在 Linux 上运行的 Windows 程序。
如何从 windows 程序调用 Linux shell 命令?
使用较新的 Wine 版本(使用 Wine 1.7.38 测试),您可以通过以下方式从 Wine 中运行 Linux 程序(此处以启动 gedit 为例):
wineconsole cmd
...从那个葡萄酒控制台:
start /unix /usr/bin/gedit
如果您想直接从 Windows 应用程序中启动 Linux 程序,以下行对我有用:
cmd /c start /unix /usr/bin/gedit
要对此进行测试,您可以直接在 Linux 控制台上调用:
wine cmd /c start /unix /usr/bin/gedit
需要注意的一件重要事情:您要启动的程序需要设置可执行位,否则从 Wine 调用它会失败!
试试这个(在我的 Linux Mint 系统上运行 Gnome 计算器):
wineconsole cmd
...并从葡萄酒控制台:
/bin/sh gcalctool
根据这个一般原则,您还可以通过编辑 wine 注册表打开文档并将文件与 linux 应用程序关联。葡萄酒常见问题解答中有一段关于它的内容:
6.6.3 如何在 Wine 中将原生程序与文件类型相关联?
所以你应该能够编写 shell 脚本并调用它们 OK。
尝试(其中 yourprogram 是您要在 wine 中执行的 linux/unix 程序)
ln -s /path/to/yourprogram /path/to/wineprefix/drive_c/windows/system32/yourprogram
这就是我让java工作的方式。
如何从 Wine 程序调用 Linux 程序——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 应用程序启动本机应用程序?在 WineHQ 常见问题解答中;注意:
请注意,每次升级 Wine 时都必须进行此更改,因为无论何时更新 wineprefix,它都会恢复。
默认情况下,您可能需要指定可执行文件的完整(或相对)路径(例如,/bin/bash
),因为 Wine 进程不会PATH
从父 Linux 进程继承环境变量。请注意,Wine 进程中的当前驱动器默认映射到 Linux 根文件夹,因此无需指定驱动器号。即/bin/bash
只是有效,但不是bash
。
另一种方法是相应地更改PATH
Wine 中的环境变量,或更改当前目录。
每当路径包含非 ASCII 字符时——作为参数CreateProcessA
——路径应该在 Wine 语言环境中并根据LANG
环境变量;另请参阅Eugene在本主题中的回答,以及论坛帖子如何设置编码以与 Wine 中的非 Unicode 应用程序一起使用。因为CreateProcessW
无论如何路径都应该是 UTF-16。
共享对象格式的 Linux 可执行文件不能从 Wine 执行。请参阅:可执行文件与共享对象以及如何在 64 位 Linux 上从 32 位 Wine 执行 shell 脚本。例如,/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.
父 Wine 进程不能WaitForSingleObject
在子 Linux 进程上等待(例如 via ),因为它没有提供子进程句柄 - 它只是 0。请参阅错误报告:CreateProcess 在启动 Linux 程序时没有正确设置 hProcess(状态:已关闭 WONTFIX)。
然而,如果子进程使用标准输出,则父进程可以通过在某个管道上阻塞读取来间接等待子进程(另见下文)。
也许这是 Wine 中的一个错误,但父进程应该关闭传递给 CreateProcess 的 std 句柄,只有在关闭相应管道的自己的句柄之后(或在它之前)。而在 Windows 中,这些句柄可以在CreateProcess
功能完成后关闭。通过 MSDN,这些句柄可能会在传递后立即关闭(请参阅CreateProcess 函数):
STARTUPINFO 或 STARTUPINFOEX 中的句柄在不再需要时必须使用 CloseHandle 关闭。
在 Wine 2.0.1 中,子 Linux 进程中的相应管道在这种情况下会立即关闭,子进程会提前停止。但不是在子 Windows 进程的情况下。
对我来说,我在这个网站上找到的第一个解决方案是有效的——将扩展名与 winebrowser 相关联,当在 wine explorer(或其他 Windows 应用程序)中单击文件时,默认的 gnome 文件查看器会从 wine 启动。
以前在 wine 1.4 中使用的 shell scripts 解决方案不适用于 wine 1.6。
但是,我注意到的问题是 Windows 编码中的名称未转换为 Linux 语言环境,从而阻止了它与例如俄语目录名称一起使用
WineHQ FAQ 中列出的 shell 脚本可以稍作修改,例如:
#!/bin/bash
WFILE=$(echo -E $2)
FILE=$(wine winepath $WFILE)
$1 $FILE
其余的就像常见问题解答中描述的那样工作。
编辑:user1182474 的评论是正确的;Wine 不会隔离它运行的程序。(它试图隐藏它,但不是很彻底。)我在使用谷歌时完全失败了。Psen 下面的评论更正确,并引用了常见问题解答。(请注意,要使其正常工作,您可能需要通过 Wine 驱动器映射提供程序目录。或者,请参阅匿名回复者的答案。)
== 旧答案 ==
Wine 隔离它运行的程序。如果所有应用程序都按预期工作,则提供与 Windows 没有区别的环境。不幸的是,出于您的目的,这意味着您无法访问主机操作系统 (Linux) 的功能。我的意思是,你可以修补 Wine 来做到这一点,但我的印象是它的工作量大于它的价值。
还有希望!Cygwin 是用于 Windows 的类 Unix 环境。您可以在 Wine 中安装 Cygwin,并使用 Cygwin 运行您的 shell 脚本。(显然,使用 'winetricks cygwin' 安装最简单)像这样调用 Cygwin 的 bash shell(在一些 Wine 程序中):
c:\cygwin\bin\bash myscript
当然,将 c:\cygwin 更改为您安装它的位置。
我喜欢在wine下运行的Far Commander ,所以我设置了这两个脚本:
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 命令行上输入:
顶部
xdg SomeDocument.PDF
并在Linux环境下得到结果。