【问题标题】:capturing pipe exit status in R在 R 中捕获管道退出状态
【发布时间】:2012-10-15 23:28:25
【问题描述】:

我正在使用 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 返回值。

【问题讨论】:

  • 您可以使用命名管道(又名 fifo)来使用带有 system2 的流处理,但这意味着将 wait=FALSE 传递给该函数,因此您仍然不会获得退出状态.

标签: linux r pipe exit-code


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2010-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多