19

我有一个使用 WINE 在 Linux 上运行的 Windows 程序。

如何从 windows 程序调用 Linux shell 命令?

4

10 回答 10

12

使用较新的 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 调用它会失败!

于 2015-04-14T16:19:33.500 回答
10

试试这个(在我的 Linux Mint 系统上运行 Gnome 计算器):

wineconsole cmd

...并从葡萄酒控制台:

/bin/sh gcalctool

根据这个一般原则,您还可以通过编辑 wine 注册表打开文档并将文件与 linux 应用程序关联。葡萄酒常见问题解答中有一段关于它的内容:

6.6.3 如何在 Wine 中将原生程序与文件类型相关联?

所以你应该能够编写 shell 脚本并调用它们 OK。

于 2011-11-20T22:42:49.220 回答
4

尝试(其中 yourprogram 是您要在 wine 中执行的 linux/unix 程序)

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

这就是我让java工作的方式。

于 2012-04-01T20:59:39.310 回答
4

如何从 Wine 程序调用 Linux 程序——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 应用程序启动本机应用程序?在 WineHQ 常见问题解答中;注意

请注意,每次升级 Wine 时都必须进行此更改,因为无论何时更新 wineprefix,它都会恢复。

2.可执行文件的路径

默认情况下,您可能需要指定可执行文件的完整(或相对)路径(例如,/bin/bash),因为 Wine 进程不会PATH从父 Linux 进程继承环境变量。请注意,Wine 进程中的当前驱动器默认映射到 Linux 根文件夹,因此无需指定驱动器号。即/bin/bash只是有效,但不是bash

另一种方法是相应地更改PATHWine 中的环境变量,或更改当前目录。

每当路径包含非 ASCII 字符时——作为参数CreateProcessA——路径应该在 Wine 语言环境中并根据LANG环境变量;另请参阅Eugene在本主题中的回答,以及论坛帖子如何设置编码以与 Wine 中的非 Unicode 应用程序一起使用。因为CreateProcessW无论如何路径都应该是 UTF-16。

3. 可执行格式

共享对象格式的 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.

4.无需等待

父 Wine 进程不能WaitForSingleObject在子 Linux 进程上等待(例如 via ),因为它没有提供子进程句柄 - 它只是 0。请参阅错误报告:CreateProcess 在启动 Linux 程序时没有正确设置 hProcess(状态:已关闭 WONTFIX)。

然而,如果子进程使用标准输出,则父进程可以通过在某个管道上阻塞读取来间接等待子进程(另见下文)。

5.管道重定向的区别

也许这是 Wine 中的一个错误,但父进程应该关闭传递给 CreateProcess 的 std 句柄,只有在关闭相应管道的自己的句柄之后(或在它之前)。而在 Windows 中,这些句柄可以在CreateProcess功能完成后关闭。通过 MSDN,这些句柄可能会在传递后立即关闭(请参阅CreateProcess 函数):

STARTUPINFO 或 STARTUPINFOEX 中的句柄在不再需要时必须使用 CloseHandle 关闭。

在 Wine 2.0.1 中,子 Linux 进程中的相应管道在这种情况下会立即关闭,子进程会提前停止。但不是在子 Windows 进程的情况下。

于 2017-08-07T10:47:02.583 回答
2

对我来说,我在这个网站上找到的第一个解决方案是有效的——将扩展名与 winebrowser 相关联,当在 wine explorer(或其他 Windows 应用程序)中单击文件时,默认的 gnome 文件查看器会从 wine 启动。

以前在 wine 1.4 中使用的 shell scripts 解决方案不适用于 wine 1.6

但是,我注意到的问题是 Windows 编码中的名称未转换为 Linux 语言环境,从而阻止了它与例如俄语目录名称一起使用

于 2014-05-07T17:09:47.603 回答
2

例如:

Z:\bin\ls

但也许您正在寻找类似http://gnuwin32.sourceforge.net/的东西,您将安装到您的葡萄酒“windows”中?或者已经提到的cygwin。

于 2013-01-23T14:05:39.323 回答
0

WineHQ FAQ 中列出的 shell 脚本可以稍作修改,例如:

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

其余的就像常见问题解答中描述的那样工作。

于 2014-11-27T00:53:08.517 回答
0

编辑: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 更改为您安装它的位置。

于 2011-05-15T05:12:06.363 回答
0

我喜欢在wine下运行的Far Commander ,所以我设置了这两个脚本:

  1. 从 Windows 启动 Linux 应用程序

C:\windows\xt.bat

start /unix /usr/bin/xterm -e %*
  1. 从 wine 环境 (Far) 在 Linux 中打开文件:

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环境下得到结果。

于 2017-04-05T10:05:39.257 回答
0

如果您需要等待命令完成并获取其输出,请使用 SSH。否则(如果您只需要启动它)这些方法中的任何一个都可以工作:

核心问题是 CreateProcess 返回零 PID 和 handle,所以你不能等待子进程完成并获得它的退出代码。

我也尝试过标准管道重定向,但没有成功。Linux子进程的输出丢失,管道为空。

因此,使用 CreateProcess 和朋友,您必须使用某种触发器文件,这看起来不太漂亮。就像我说的,我们将改用 SSH。

于 2020-10-30T04:23:03.153 回答