【问题标题】:How to tee stdout/stderr from a subprocess in Rust如何从 Rust 中的子进程 tee stdout/stderr
【发布时间】:2021-02-05 08:45:14
【问题描述】:

我想捕获子进程的 stdout/stderr,但也想将输出流式传输到我的进程的 stdout/stderr。在 bash 我会做类似的事情:

my_command > >(tee /tmp/capture.out) 2> >(tee /tmp/capture.err >&2)

在 Rust 中是否有任何合理简洁或典型的方法来做到这一点?查看std::process::Child.wait_with_output()sys::pipe::read2 直接处理stdout/stderr 似乎有些涉及(并且涉及到unsafepoll 的调用)。

提出问题的另一种方式可能是“通过子进程的 stdout 和 stderr 进行流式传输的预期方式是什么?”这至少可以让我手动捕获和打印流的内容。

我目前正在使用 std::process,但如果使用 subprocess 板条箱更容易,我愿意换成它。

【问题讨论】:

    标签: rust subprocess


    【解决方案1】:

    直接处理 stdout/stderr 似乎有些复杂(并且涉及对 poll 的不安全调用

    这可能会涉及到任何一种方式,因为 Rust 并没有真正对复杂的管道和 fd 操作进行抽象,这需要相当多的抽象:创建两个管道并进行大量复制以正确设置所有要匹配的输入和输出流。

    执行此操作的“简单”方法(实际上并不容易,但它避免了处理 libc 和 fds)是生成线程以在各个位之间显式复制数据。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-04-06
      • 2013-08-26
      • 1970-01-01
      • 2015-08-18
      • 1970-01-01
      • 2011-07-07
      • 2020-06-23
      • 1970-01-01
      相关资源
      最近更新 更多