2015-04-05 43 views
2

使用Command struct,我如何向stdout和stderr缓冲区添加前缀?如何在[stdout]和[sterr]前缀命令stdout?

我想输出是这个样子:

[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) 
}); 

回答

2

我不相信你可以做你真正想要的,现在做的事。理想情况下,您可以将Write的实现者提供给Process::stdout方法。不幸的是,set of choices for Stdio是稀疏的。也许你可以竞选让这个功能成为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); 
}