Process 将工艺标准管连接至另一标准管
我正在尝试启动一个curl下载,然后将它的标准输出传输到我程序的标准输出。以下是我得到的(仍在使用旧io):Process 将工艺标准管连接至另一标准管,process,stdout,rust,Process,Stdout,Rust,我正在尝试启动一个curl下载,然后将它的标准输出传输到我程序的标准输出。以下是我得到的(仍在使用旧io): 这很好,但是curl下载需要相当长的时间。因此,在curl仍在下载时(而不仅仅是在最后)显示它的stdout(=>下载进度)将是一件好事。我试了很多东西,但都没法用。有什么想法吗?不要使用带有输出的wait\u,只需从属于过程的管道中读取即可。当你不能再阅读时,你可以等待这个过程。下面是一个没有错误处理的示例: #![feature(old_io)] use std::old_io::
这很好,但是curl下载需要相当长的时间。因此,在curl仍在下载时(而不仅仅是在最后)显示它的stdout(=>下载进度)将是一件好事。我试了很多东西,但都没法用。有什么想法吗?不要使用带有输出的
wait\u
,只需从属于过程的管道中读取即可。当你不能再阅读时,你可以等待这个过程。下面是一个没有错误处理的示例:
#![feature(old_io)]
use std::old_io::process::Command;
use std::old_io::stdio;
fn main() {
let mut process = Command::new("bash")
.arg("-c")
.arg("for i in 1 2 3 4 5; do echo start-$i; sleep 1; echo stop-$i; done")
.spawn()
.ok()
.expect("Command failed");
let buf = &mut [0; 256];
while let Ok(bytes) = process.stdout.as_mut().unwrap().read(buf) {
stdio::stdout_raw().write_all(&buf[..bytes]).unwrap();
}
let _ = process.wait_with_output().ok().expect("Download failed.");
}
将process.stdout.as_mut().unwrap()
放入while循环,并在每次迭代中执行它,这是惯用方法吗?我不知道惯用方法,它只是显示解决方案的一般形状的最简单方法。这里所有的“错误处理”都只是为了panic!()
每当出现问题时。如果你能避免多次打电话,那可能是值得的!
#![feature(old_io)]
use std::old_io::process::Command;
use std::old_io::stdio;
fn main() {
let mut process = Command::new("bash")
.arg("-c")
.arg("for i in 1 2 3 4 5; do echo start-$i; sleep 1; echo stop-$i; done")
.spawn()
.ok()
.expect("Command failed");
let buf = &mut [0; 256];
while let Ok(bytes) = process.stdout.as_mut().unwrap().read(buf) {
stdio::stdout_raw().write_all(&buf[..bytes]).unwrap();
}
let _ = process.wait_with_output().ok().expect("Download failed.");
}