如何从 Rust 的进程内部重定向 stderr?

Ska*_*ett 5 pipe stderr rust

我正在尝试重定向 Stderr从进程内部文件描述符,但似乎没有它的实现,而且我没有看到与dup2C/C++类似的任何内容的明确路线。

我试过了:

  • 直接实现Read( impl Read for Stderr),但需要覆盖整个代码库。
  • 消费文件描述符中的数据,然后进入File,然后进入ReadBuf

    trait FDReader {
        fn consume(&mut self);
    }
    
    impl FDReader for Stderr {
        fn consume(&mut self) {
            let f = std::fs::File::from_raw_fd(self.as_raw_fd());
            let mut extract = String::new();
            BufReader::new(f).read_to_string(&mut extract);
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)

    consume之所以专注是因为我在测试代码时不必完全返回任何内容,尽管这不起作用。

  • 由于我在 Linux 系统上运行,并且我不打算发布代码,因此我还考虑了重定向/proc/self/fd/2 -> /dev/null,然后在我想写入时返回原始指针引用。对于这个范围来说,这是最重要的。

我也想过libc::dup2直接使用——虽然我厌倦了它。

She*_*ter 6

在标准库1 中没有办法做到这一点。该插科打诨箱允许重定向标准错误或标准输出到文件里或者什么,但它仅适用于* nix系统。

从不同的角度来看,我鼓励您根本不要直接使用 stdout 或 stderr。相反,使用依赖注入来传递可以写入的值。而不是使用println,使用writeln

也可以看看:


1这并非严格意义上的正确。你有没有注意到stdout 和 stderr 在测试过程中没有输出?这是因为编译器(和测试套件)使用了一对不稳定的隐藏函数,这些函数允许更改 stdout 和 stderr 的线程本地实例。

也可以看看: