Process 将工艺标准管连接至另一标准管

Process 将工艺标准管连接至另一标准管,process,stdout,rust,Process,Stdout,Rust,我正在尝试启动一个curl下载,然后将它的标准输出传输到我程序的标准输出。以下是我得到的(仍在使用旧io): 这很好,但是curl下载需要相当长的时间。因此,在curl仍在下载时(而不仅仅是在最后)显示它的stdout(=>下载进度)将是一件好事。我试了很多东西,但都没法用。有什么想法吗?不要使用带有输出的wait\u,只需从属于过程的管道中读取即可。当你不能再阅读时,你可以等待这个过程。下面是一个没有错误处理的示例: #![feature(old_io)] use std::old_io::

我正在尝试启动一个curl下载,然后将它的标准输出传输到我程序的标准输出。以下是我得到的(仍在使用旧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.");
}