将进程的标准输出管道传输到另一个标准输出

Piping stdout of Process to another stdout

我正在尝试开始 curl 下载,然后将它的标准输出通过管道传输到我的程序的标准输出。这是我得到的(仍在使用 old_io):

let process = Command::new("curl")
    .arg("-o ").arg(&self.filename).arg(&self.url)
    .spawn().ok().expect("Download failed.");

let output = process.wait_with_output().ok().expect("Download failed.");

这很好用,但是 curl 下载需要相当长的时间。所以在 curl 的标准输出(=> 下载进度)还在下载的时候显示它会很整洁,而不仅仅是在结束时。我尝试了很多东西,但无法让这个东西工作。有什么想法吗?

不使用 wait_with_output,只需从属于 process 的管道中读取即可。当你不能再阅读时,你可以等待这个过程。这是一个没有错误处理的例子:

#![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.");
}