如何将命令标准输出保存到文件?

How to save command stdout to a file?

我正在编写一个具有特定日志记录要求的函数。我想捕获 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! 电话 returns [].

即使读取到另一个缓冲区也会打印出错误的值。下面,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()
}

我错过了什么?

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

    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");

Even reading to another buffer prints the wrong value. Below, sys_command("10") prints 3.

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