我在Linux上使用WINE运行Windows程序。
如何从Windows程序调用Linux shell命令?
答案 0 :(得分:8)
试试这个(在我的Linux Mint系统上运行Gnome计算器):
wineconsole cmd
......来自葡萄酒控制台:
/bin/sh gcalctool
根据这个一般原则,您还可以通过编辑wine注册表打开文档并将文件与linux应用程序相关联。葡萄酒常见问题中有一节介绍它:
6.6.3 How do I associate a native program with a file type in Wine?
所以你应该能够编写shell脚本并调用它们。
答案 1 :(得分:7)
使用较新的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调用它将失败!
答案 2 :(得分:4)
尝试(你的程序是你想在葡萄酒中执行的linux / unix程序)
ln -s /path/to/yourprogram /path/to/wineprefix/drive_c/windows/system32/yourprogram
这就是我让java工作的方式。
答案 3 :(得分:2)
对我来说,我发现on this site工作的第一个解决方案 - 将扩展名与winebrowser相关联,并且当点击wine explorer(或其他Windows应用程序)中的文件时,默认的gnome文件查看器会从wine中启动。
以前使用shell脚本的解决方案,在wine 1.4中使用,不适用于wine 1.6 。
然而,我注意到的问题是Windows编码中的名称没有转换为Linux语言环境,因此阻止了这种情况。俄语目录名称
答案 4 :(得分:2)
如何从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
项,则此代码会检查并修改.
。
参见WineHQ FAQ中的How do I launch native applications from a Windows application?;的 NB 强>:
请注意,每次升级时都必须进行此更改 Wine,因为每当wineprefix更新时它都会被还原。
默认情况下,您可能需要指定可执行文件的完整(或相对)路径(例如,/bin/bash
),因为Wine进程不会继承{{1}来自父Linux进程的环境变量。
请注意,默认情况下,Wine进程中的当前驱动器将映射到Linux根文件夹,因此无需指定驱动器号。即PATH
只是有效,但不是/bin/bash
。
另一种方法是相应地更改Wine中的bash
环境变量,或者更改当前目录。
每当路径包含非ASCII字符时 - 作为PATH
的参数 - 路径应该在Wine区域设置中并且根据CreateProcessA
环境变量;另请参阅本主题中的answer by Eugene,以及论坛发布如何set encoding to use with non-Unicode application in Wine。对于LANG
,路径在任何情况下都应该是UTF-16。
无法从Wine执行共享对象格式的Linux可执行文件。请参阅:Executables vs Shared objects和How to execute shell scripts from 32-bit Wine on 64-bit Linux。例如,CreateProcessW
可以是" ELF 64位LSB共享对象" (参见/bin/dash
的输出),在这种情况下不能从Wine执行。错误消息说:
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.
)子进程,因为它没有提供子进程句柄 - 它只是0.请参阅bugreport:{{3 (状态:CLOSED WONTFIX)。
然而,如果子进程使用stdout,父进程可以通过阻塞对特定管道的读取来间接等待子进程(参见下文)。
也许这是Wine中的一个错误,但是父进程应该关闭std句柄,这些句柄只有在关闭相应管道的自己的句柄(或者就在它之前)之后才会传递给CreateProcess。在Windows中,这些句柄可以在WaitForSingleObject
函数完成后关闭。通过MSDN,这些句柄可以在通过后立即关闭(参见CreateProcess doesn't set hProcess correctly when starting a Linux program):
必须关闭STARTUPINFO或STARTUPINFOEX中的句柄 当不再需要它们时关闭手柄。
在Wine 2.0.1中,子Linux进程中的相应管道将在这种情况下立即关闭,子进程将过早停止。但不是在Windows子进程的情况下。
答案 5 :(得分:1)
编辑:user1182474的评论是正确的; Wine不会隔离它运行的程序。 (它试图隐藏它,但不是很彻底。)我完全没有使用谷歌。 Psen的评论更为正确,并引用了常见问题解答。 (请注意,要使其工作,您可能需要通过Wine驱动器映射提供程序的目录。或者,请参阅Anonymous Replier的答案。)
==旧答案==
Wine隔离了它运行的程序。如果所有应用程序都按预期工作,则应用程序将呈现与Windows无法区分的环境。不幸的是,这意味着您无法访问主机操作系统(Linux)的功能。我的意思是,你可以修补葡萄酒来做到这一点,但我觉得它会比它的价值更多的工作。
有希望! Cygwin是一个类似Unix的Windows环境。您可以在Wine中安装Cygwin,并使用Cygwin来运行您的shell脚本。 (显然,使用'winetricks cygwin'进行安装是最容易的)调用Cygwin的bash shell(在一些Wine程序中),如下所示:
c:\cygwin\bin\bash myscript
当然,将c:\ cygwin更改为您安装的位置。
答案 6 :(得分:1)
例如:
Z:\bin\ls
但也许你正在寻找像http://gnuwin32.sourceforge.net/这样的东西,你将安装到你的葡萄酒" windows&#34 ;?或者已经提到过的cygwin。
答案 7 :(得分:0)
可以稍微修改listed on WineHQ FAQ的shell脚本,例如:
#!/bin/bash
WFILE=$(echo -E $2)
FILE=$(wine winepath $WFILE)
$1 $FILE
其余的工作正如FAQ中所述。
答案 8 :(得分:0)
我喜欢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环境中获得结果。
答案 9 :(得分:0)
如果需要等待命令完成并获取输出,请使用SSH。否则(如果您只需要启动它),这些方法中的任何一种都将起作用:
核心问题是CreateProcess返回zero PID and handle,因此您不能等待子进程完成并获取其退出代码。
我也尝试过standard pipes redirection,但没有运气。 Linux子进程的输出丢失,管道为空。
因此,与CreateProcess和朋友一起,您必须使用某种trigger files,它看起来不太漂亮。就像我说的那样,我们将改为使用SSH。