如何为命令 stdout 添加 [stdout] 和 [stderr] 前缀?

2024-05-16

使用命令结构 https://doc.rust-lang.org/std/process/struct.Command.html,如何向 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)
});

我不相信你现在就能做你真正想做的事。理想情况下,您能够提供一个实现者Write to the Process::stdout方法。不幸的是,的一组选择Stdio https://doc.rust-lang.org/std/process/struct.Stdio.html#method.piped是稀疏的。也许您可以争取将此作为 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);
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何为命令 stdout 添加 [stdout] 和 [stderr] 前缀? 的相关文章

随机推荐