Rust 如何在命令stdout前面加上[stdout]和[sterr]?

Rust 如何在命令stdout前面加上[stdout]和[sterr]?,rust,Rust,使用,如何向stdout和stderr缓冲区添加前缀 我希望输出如下所示: [stdout] things are good. [sterr] fatal: repository does not exist. 这也适用于程序的主标准输出,因此程序打印的任何内容都有这样的前缀 以下是我目前拥有的代码: let output = Command::new("git").arg("clone").output().unwrap_or_else(|e| { panic!("Failed to

使用,如何向stdout和stderr缓冲区添加前缀

我希望输出如下所示:

[stdout] things are good.
[sterr] fatal: repository does not exist.
这也适用于程序的主标准输出,因此程序打印的任何内容都有这样的前缀

以下是我目前拥有的代码:

let output = Command::new("git").arg("clone").output().unwrap_or_else(|e| {
    panic!("Failed to run git clone: {}", e)
});

我不相信你现在能做你真正想做的事。理想情况下,您应该能够为
Process::stdout
方法提供
Write
的实现者。不幸的是,这是稀疏的。也许您可以将此作为Rust 1.1的功能请求,或者创建一个板条箱来开始充实一些细节(如跨平台兼容性)

如果可以删除stdout/stderr的交错,则此解决方案可以帮助:

use std::io::{BufRead,BufReader};
use std::process::{Command,Stdio};

fn main() {
    let mut child =
        Command::new("/tmp/output")
        .stdout(Stdio::piped())
        .stderr(Stdio::piped())
        .spawn().unwrap();

    if let Some(ref mut stdout) = child.stdout {
        for line in BufReader::new(stdout).lines() {
            let line = line.unwrap();
            println!("[stdout] {}", line);
        }
    }

    if let Some(ref mut stderr) = child.stderr {
        for line in BufReader::new(stderr).lines() {
            let line = line.unwrap();
            println!("[stderr] {}", line);
        }
    }

    let status = child.wait().unwrap();
    println!("Finished with status {:?}", status);
}