从.NET执行Cygwin进程?

我正在尝试从.NET应用程序启动Cygwin版本的ruby.exe,但我被卡住了。

c:\>"c:\cygwin\bin\ruby.exe" c:\test\ruby.rb /usr/bin/ruby: no such file to load -- ubygems (LoadError) 

如你所见,Ruby无法找到库,因为它正在寻找一些Linux风格的路径。

显然,当我从.NET运行ruby.exe时,由于找不到库,它就像上面那样失败了。

如果我没有加载任何库它可以正常工作:

 c:\>"c:\cygwin\bin\ruby.exe" -v ruby 1.8.7 (2008-08-11 patchlevel 72) [i386-cygwin] 

最初cygwin从这个cygwin.bat开始

 chdir C:\cygwin\bin bash --login -i 

我怎样才能让.NET首先进入cygwin环境然后在那个环境中执行ruby?

  • 我不能使用Windows Ruby,我需要cygwin ruby​​。
  • 我知道交互式驱动“bash”的潜在用法但听起来很脏,除非有很好的方法。

您是否正在使用混合本机Windows ruby​​gems和Cygwin ruby​​? 使用Cygwin ruby​​gems似乎对我来说很好。 (为什么你的Cygwin ruby​​解释器显然在搜索带有Windows反斜杠的路径?)。

或者,你试过run.exe吗?

 C:\cygwin\bin\run.exe -p /starting/dir exe_to_run 

这是man-page条目:

名称

run – 启动带有隐藏控制台窗口的程序

概要

运行[-p path]命令[-wait]参数

runco​​mmand [-p path] [-wait]参数

描述

Windows程序是GUI程序或控制台程序。 启动时,控制台程序将附加到现有控制台或创建新控制台。 GUI程序永远不会附加到现有的控制台。 没有办法连接到现有的控制台,但如果作为GUI程序启动则隐藏它。

run会为你做这个。 它作为中间函数启动并启动程序但隐藏了控制台窗口。

使用-p path,您可以添加PATH环境变量的路径。

发出-wait作为第一个程序参数将使run等待程序completition,否则立即返回。

第二个变体是用于创建包装器。 如果可执行文件名为runco​​mmand(例如runemacs),则run将尝试启动程序(例如emacs)。

例子

运行-p / usr / X11R6 / bin xterm

运行emacs -wait runemacs -wait

运行make -wait

为什么不执行从.NET应用程序运行ruby的非交互式bash shell? 就像是:

 bash --login -c   

不确定您的文件结构,但是,例如,

 bash --login -c /usr/bin/ruby ~/test/ruby.rb 

查看bash手册页中的-c选项以获取更多信息。