我正在尝试重定向 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直接使用——虽然我厌倦了它。
在标准库1 中没有办法做到这一点。该插科打诨箱允许重定向标准错误或标准输出到文件里或者什么,但它仅适用于* nix系统。
从不同的角度来看,我鼓励您根本不要直接使用 stdout 或 stderr。相反,使用依赖注入来传递可以写入的值。而不是使用println,使用writeln。
也可以看看:
1这并非严格意义上的正确。你有没有注意到stdout 和 stderr 在测试过程中没有输出?这是因为编译器(和测试套件)使用了一对不稳定的隐藏函数,这些函数允许更改 stdout 和 stderr 的线程本地实例。
也可以看看: