【问题标题】:How to save command stdout to a file?如何将命令标准输出保存到文件中?
【发布时间】:2022-01-17 07:29:13
【问题描述】:

我正在编写一个具有特定日志记录要求的函数。我想捕获Command::new() 调用的输出并将其保存到文件中。为了简单起见,我在这里使用echo

fn sys_command(id: &str) -> u64 {
    let mut cmd = Command::new("echo")
        .args(&[id])
        .stdout(Stdio::piped())
        .spawn()
        .expect("failed to echo");

    let stdout = cmd.stdout.as_mut().unwrap();
    let stdout_reader = BufReader::new(stdout);
    // let log_name = format!("./tmp/log/{}.log", id);
    // fs::write(log_name, &stdout_reader);
    println!("{:?}", stdout_reader.buffer());

    cmd.wait().expect("failed to call");
    id.parse::<u64>().unwrap()
}

如何捕获输出并将其保存到文件中?我做了一个游乐场here。我的println! 调用返回[]

即使读取另一个缓冲区也会打印错误的值。下面,sys_command("10") 打印 3Here's 更新后的游乐场。

fn sys_command(id: &str) -> u64 {
    let mut buffer = String::new();
    let mut cmd = Command::new("echo")
        .args(&[id])
        .stdout(Stdio::piped())
        .spawn()
        .expect("failed to echo");

    let stdout = cmd.stdout.as_mut().unwrap();
    let mut stdout_reader = BufReader::new(stdout);
    let result = stdout_reader.read_to_string(&mut buffer);
    println!("{:?}", result.unwrap());

    cmd.wait().expect("failed to draw");
    id.parse::<u64>().unwrap()
}

我错过了什么?

【问题讨论】:

    标签: rust io child-process


    【解决方案1】:

    您应该将进程的输出重定向到文件,而不是在内存中捕获输出然后将其写入文件。这样更简单、更高效。

        let log_name = format!("./tmp/log/{}.log", id);
        let log = File::create(log_name).expect("failed to open log");
    
        let mut cmd = Command::new("echo")
            .args(&[id])
            .stdout(log)
            .spawn()
            .expect("failed to start echo");
    
        cmd.wait().expect("failed to finish echo");
    

    即使读取另一个缓冲区也会打印错误的值。下面,sys_command("10") 打印 3

    这无关 — read_to_string() 返回读取的字节数,而不是它们的内容,并且有 3 个字符:'1' '0' '\n'

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-02-27
      • 2013-01-17
      • 2018-08-08
      • 2016-07-13
      • 2021-02-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多