关于rust:如何在Command stdout前面加上[stdout]和[sterr]?

How do I prefix Command stdout with [stdout] and [sterr]?

使用Command结构,如何为stdout和stderr缓冲区添加前缀?

我希望输出看起来像这样:

1
2
[stdout] things are good.
[sterr] fatal: repository does not exist.

这也可以应用到程序的主标准输出,因此程序打印的所有内容都带有这样的前缀。

这是我目前拥有的代码:

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

我不相信您现在可以做自己真正想做的事情。 理想情况下,您将能够为Process::stdout方法提供Write的实现者。 不幸的是,Stdio的选择集很少。 也许您可以进行宣传,以使其成为Rust 1.1的功能要求,或者创建一个包装箱以开始充实一些细节(例如跨平台兼容性)

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
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);
}