在Ruby中生成一个进程,捕获标准输出和标准错误,获取退出状态

5

我想从一个ruby rake脚本中运行一个可执行文件,比如说foo.exe

我希望从foo.exe中获取STDOUTSTDERR输出,并将其直接写入到我正在运行rake任务的控制台中。

当进程完成时,我想将退出代码捕获到一个变量中。我该如何实现这一点?

我已经尝试了backticksprocess.spawnsystem,但我无法得到我想要的所有行为,只能得到部分。

更新:我在Windows上,在标准命令提示符中运行,而不是cygwin。


Kernel#system 的哪一部分没有被覆盖? - Lars Haugseth
我知道Net-SSH是一个纯Ruby库,它与openSSL一起工作,并具有这样的功能 - 它的channelexec方法返回一个数组[stdout,stderr,exit_code,exit_signal]。也许你可以以某种方式使用它... - Ribtoks
也许你应该列出每个命令的问题? - Andrew Marshall
2个回答

8
system可以实现您所需的STDOUT行为,并返回零退出代码的true,这非常有用。使用$?获取最后一个system调用的信息,以检查退出状态:
system 'foo.exe'
$?.exitstatus

我在Runner.execute_command中使用了这些东西的组合作为一个例子。


结果证明我不需要 STDERR,所以无法验证它是否处理了它,但它满足我的需求。 - Andrew Bullock

2

反引号将使stdout捕获到结果字符串中。

foo.exe表明您正在运行Windows - 您是否安装了类似cygwin的东西?如果在Unixy shell中运行脚本,则可以执行以下操作:

result = `foo.exe 2>&1`
status = $?.exitstatus

快速搜索结果显示这也适用于本机Windows shell,但我无法测试这种假设。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接