实现Ruby的IO.popen()和system()的替换

时间:2008-09-30 19:34:21

标签: ruby

Ruby中的IO.popen()和system()非常缺乏一些有用的功能,例如:

  • 获取函数的返回值
  • 捕获stdout和stderr(单独并合并)
  • 在不产生额外的cmd.exe或/ bin / sh进程的情况下运行

Python有一个模块“subprocess”,我正在考虑将其用作Ruby中类似模块的灵感。现在回答问题:

  • Ruby程序员如何解决上述问题,例如在进行popen()调用时获取返回值?
  • 这是否已经实施了?

3 个答案:

答案 0 :(得分:9)

  • system()退出状态可以使用$?.exitstatus
  • 捕获 可以使用system 'command 2>&1' 之类的东西捕获
  • stderr

答案 1 :(得分:9)

看一下标准的Ruby库open3。这将使您可以访问stdin,stdout和stderr。

还有一个名为open4的外部项目,它允许您在不使用魔术变量名的情况下获取退出状态。

答案 2 :(得分:1)

在测试git_remote_branch时,我觉得有必要做到这一点。该工具调用shell,我想准确捕获测试运行期间显示的内容,无论git显示什么,无论是在stdout还是stderr中吐出。

我有一个可以被观察到的完全可重复使用的模块here(麻省理工学院许可证:随意使用,不要起诉我; - )

您可以在git_remote_branch here的测试中看到它的实际效果。

另外,我专门为capture_fu设置了一个repo,它包含了一些测试和内容。该项目虽然设置得不是很好。我没有花太多时间让它可释放; - )