使用Command struct,如何在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)
});
答案 0 :(得分: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);
}