我正在使用 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_pclose
C 函数的方法。close()
我不幸遇到了这个静态变量src/main/connections.c
static Rconnection Connections[NCONNECTIONS];
由于无论如何我都必须运行objcopy --globalize-symbol=Connections libR.so /path/to/my/libR.so
才能访问该变量,看来我最好的解决方案是用我自己的补丁重建 R 以捕获 pclose 返回值。