在R中捕获管道退出状态

E_G*_*E_G 7 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;
}
Run Code Online (Sandbox Code Playgroud)

我尝试使用实现R_pclose复制R代码的C函数的方法,close()但保存此返回值.我很遗憾地遇到了这个静态变量src/main/connections.c

static Rconnection Connections[NCONNECTIONS];
Run Code Online (Sandbox Code Playgroud)

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

MvG*_*MvG 1

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