2015-04-05 45 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); 
}