gpt4 book ai didi

rust - 如何将命令 stdout 保存到文件?

转载 作者:行者123 更新时间:2023-12-03 08:12:58 25 4
gpt4 key购买 nike

我正在编写一个具有特定日志记录要求的函数。我想捕获 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()
}

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

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

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() 返回读取的字节数,而不是它们的内容,并且有 3 个字符:'1' '0' '\n'.

关于rust - 如何将命令 stdout 保存到文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70341205/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com