7

我正在使用 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 代码但保存此返回值的R_pcloseC 函数的方法。close()我不幸遇到了这个静态变量src/main/connections.c

static Rconnection Connections[NCONNECTIONS];

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

4

1 回答 1

1

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

于 2012-10-25T20:43:51.743 回答