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