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

时间:2019-01-29 20:52:17

标签: rust pipe stderr

我正在尝试从进程内部重定向Stderr文件描述符,但是似乎没有实现,并且我看不到从dup2到类似Read的任何东西的清晰路线C / C ++。

我尝试过:

  • 直接实现impl Read for StderrFile),但要覆盖整个代码库。
  • 使用文件描述符中的数据,然后放入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); } }

    consume

    我专注于/proc/self/fd/2 -> /dev/null,因为在测试代码时我不必完全返回任何内容,尽管这行不通。

  • 因为我正在Linux系统上运行,并且我不打算发布代码,所以我还考虑了重定向libc::dup2,然后在我想写到那里时返回原始指针引用。 。在该范围内,这已经超出了顶部。

我也考虑直接使用<div class="vsr"> <a href="/91.1/303535.html">L'Américain (intégral)</a> 8a <span class="ag">7c+</span> <em>Tony Fouchereau</em> <span class="btype">traversée d-g, surplomb, départ assis</span> <span class="glyphicon glyphicon-camera" aria-hidden="true"></span> <span class="glyphicon glyphicon-film" aria-hidden="true"></span> </div> -尽管我对此感到厌倦。

1 个答案:

答案 0 :(得分:4)

在标准库 1 中无法执行此操作。 gag crate允许将stderr或stdout重定向到文件或不重定向到任何文件,但仅适用于* nix系统。

从另一个角度来看问题,我建议您完全不直接使用stdout或stderr 。而是使用依赖注入传递可以写入的值。代替使用println,而使用writeln

另请参阅:


1 这不是严格地。您是否注意到过stdout and stderr are not output during tests?这是因为编译器(和测试套件)利用a pair of unstable, hidden functions来允许更改stdout和stderr的线程本地实例。

另请参阅: