rust - 如何在Rust的子过程中准备stdout/stderr

标签 rust subprocess

我想捕获子进程的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 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/

相关文章:

error-handling - 如何展平嵌套结果?

ruby - 如何在 ruby​​ 中使用反引号开始子进程的连续输出

python - Pyinstaller 在 Windows 下的 onefile 可执行文件上出现 subprocess.check_output 问题

python - 您如何简单地更改 Python 脚本以捕获由其自身及其子进程写入 stdout 的所有内容?

python - 子进程命令未使用 ls 命令查找文件?

rust - 生成器似乎没有公开 `resume()` 方法

input - 如何在 Rust 1.0 中读取用户输入的整数?

sockets - 如何与 Rust 中的反向 shell 交互?

python - 为什么 Popen.communicate() 返回 b'hi\n' 而不是 'hi' ?

rust - 为什么 Rust 的 Cargo 不认为 0.8.3 版本具有与 0.9.0 版本兼容的 API?