如何从Rust中的子流程中测试标准输出/标准输出
我想捕获子流程的stdout/stderr,但也要将输出流传输到流程的stdout/stderr。在bash中,我会这样做:如何从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
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)是生成线程来显式地在各个位之间复制数据