如何从Rust中的子流程中测试标准输出/标准输出

如何从Rust中的子流程中测试标准输出/标准输出,rust,subprocess,Rust,Subprocess,我想捕获子流程的stdout/stderr,但也要将输出流传输到流程的stdout/stderr。在bash中,我会这样做: my_command > >(tee /tmp/capture.out) 2> >(tee /tmp/capture.err >&2) 在Rust中是否有任何合理简洁或典型的方法可以做到这一点?直接查看和处理stdout/stderr似乎有点牵连(并且涉及到不安全调用轮询) 构建问题的另一种方式可能是“通过子流程的stdout和st

我想捕获子流程的stdout/stderr,但也要将输出流传输到流程的stdout/stderr。在bash中,我会这样做:

my_command > >(tee /tmp/capture.out) 2> >(tee /tmp/capture.err >&2)
在Rust中是否有任何合理简洁或典型的方法可以做到这一点?直接查看和处理stdout/stderr似乎有点牵连(并且涉及到
不安全
调用
轮询

构建问题的另一种方式可能是“通过子流程的stdout和stderr进行流处理的预期方式是什么?”这至少允许我手动捕获和打印流的内容

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

直接处理stdout/stderr似乎有点复杂(并且涉及到不安全的轮询调用)

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

实现这一点的“简单”方法(实际上并不容易,但它避免了必须处理libc和fds)是生成线程来显式地在各个位之间复制数据