从WINE中运行的程序执行Shell命令

时间:2011-05-14 18:46:15

标签: linux shell wine

我在Linux上使用WINE运行Windows程序。

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

10 个答案:

答案 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方面有五点。

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项,则此代码会检查并修改.

参见WineHQ FAQ中的How do I launch native applications from a Windows application?;的 NB

  

请注意,每次升级时都必须进行此更改   Wine,因为每当wineprefix更新时它都会被还原。

2。可执行文件的路径

默认情况下,您可能需要指定可执行文件的完整(或相对)路径(例如,/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。

3。可执行格式

无法从Wine执行共享对象格式的Linux可执行文件。请参阅:Executables vs Shared objectsHow to execute shell scripts from 32-bit Wine on 64-bit Linux。例如,CreateProcessW可以是" ELF 64位LSB共享对象" (参见/bin/dash的输出),在这种情况下不能从Wine执行。错误消息说:

file /bin/dash

4。没等了

父级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,父进程可以通过阻塞对特定管道的读取来间接等待子进程(参见下文)。

5。管道重定向的差异

也许这是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 下运行,所以我设置了这两个脚本:

  1. 从Windows启动Linux应用程序
  2. C:\ Windows \ xt.bat

    start /unix /usr/bin/xterm -e %*
    
    1. 从葡萄酒环境(远程)打开Linux中的文件:
    2. 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。