实现Ruby的IO.popen()和system()的替代品
时间:2020-03-06 14:56:34 来源:igfitidea点击:
Ruby中的IO.popen()和system()非常缺少几个有用的功能,例如:
- 获得函数的返回值
- 捕获stdout和stderr(分别和合并)
- 运行而不会产生额外的cmd.exe或者/ bin / sh进程
Python有一个模块"子进程",我当时正在考虑将其用作Ruby中类似模块的灵感。现在开始提问:
- Ruby程序员如何解决上述问题,例如在执行popen()调用时获取返回值?
- 这已经实施了吗?
解决方案
- 可以使用$ ?. exitstatus捕获system()退出状态。
- stderr可以用`system'command 2>&1'之类的东西捕获。
看一下标准的Ruby库open3. 这将使我们可以访问stdin,stdout和stderr。
还有一个名为open4的外部项目,它使我们无需使用魔术变量名即可获得退出状态。
在测试git_remote_branch时,我觉得有必要做到这一点。该工具调出外壳,我想准确捕获测试运行期间显示的内容,无论git显示的内容是什么,无论它是用stdout还是stderr吐出来的。
我有一个完全可重用的模块,可以在这里观察到(MIT许可证:随意使用,请不要起诉我;-)
我们可以在此处查看git_remote_branch的测试中的操作。
另外,我专门为capture_fu设置了一个仓库,其中包含一些测试和内容。不过,该项目的设置并不十分理想。我没有花太多时间使它可发布;-)