在R中捕获管道退出状态

时间:2012-10-25 17:53:47

标签: linux r pipe exit-code

我使用R的pipe()函数来捕获shell命令的输出,但我也希望从命令中获取退出代码。

我知道我可以在这里使用system2,但我需要管道的优势,即能够以流方式处理输出。

我正在考虑编写自己的库来包装popen()pclose() C函数,以利用pclose()返回退出状态的事实,但也许这可以避免。

有什么建议吗?谢谢!

注意

有一些方法可以使用临时文件,命名管道等来执行此操作,但我最好还是避免这些变通办法。我愿意编写一个带有R-> C函数的共享库(我甚至愿意复制粘贴部分R源代码),但我不愿意重建R。

更新

我开始阅读R源代码并找到未经检查的pclose调用:

src/main/connections.c中的

static void pipe_close(Rconnection con)
{
    pclose(((Rfileconn)(con->private))->fp);
    con->isopen = FALSE;
}

我尝试使用实现R_pclose C函数的方法,该函数复制close()的R代码,但保存此返回值。遗憾的是,我在src/main/connections.c

中遇到了这个静态变量
static Rconnection Connections[NCONNECTIONS];

由于我必须运行objcopy --globalize-symbol=Connections libR.so /path/to/my/libR.so来访问变量,看起来我最好的解决方案是使用我自己的补丁重建R以捕获pclose返回值。

1 个答案:

答案 0 :(得分:1)

丑陋的黑客攻击:您可以将命令调用包装到一个小的shell脚本中,该脚本将其子代的退出代码写入某个临时文件。因此,当流结束时,您可以等到该文件的大小非零,然后从那里读取状态。我希望有人提出更好的解决方案,但至少这是一种解决方案。