我想捕获子进程的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的处理(并涉及到对unsafe
的poll
调用)。解决问题的另一种方式可能是“在子流程的stdout和stderr上流式传输的预期方式是什么?”至少可以让我手动捕获和打印流的内容。
我目前正在使用
std::process
,但如果使用subprocess
crate 更简单,我将愿意换成它。
最佳答案
handling stdout/stderr directly seems somewhat involved (and involves an unsafe call to poll
由于Rust实际上并没有对复杂的pipe&fd操作进行抽象,因此可能会涉及其中的任何一种,这需要大量的抽象:创建两个管道并进行大量的dup'ing以正确设置所有输入和输出要匹配的流。
做到这一点的“简单”方法(实际上并不容易,但避免了必须处理libc和fds)是生成线程以在各个位之间显式复制数据。
关于rust - 如何在Rust的子过程中准备stdout/stderr,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66060139/