如何捕获传输到Rust程序的进程的输出?

时间:2018-04-09 12:30:41

标签: rust pipe rust-cargo

我知道如何阅读命令行参数,但是我在从管道读取命令输出时遇到了困难。

  1. 使用管道连接将数据输出到Rust程序的程序(A):

    A | R
    
  2. 程序应该逐行消耗数据。

    $ pwd | cargo run应打印pwd输出。

    OR

    $ find . | cargo run应该输出超过1行的find命令输出。

3 个答案:

答案 0 :(得分:5)

BufRead::lines上使用locked handle to standard input

use std::io::{self, BufRead};

fn main() {
    let stdin = io::stdin();
    for line in stdin.lock().lines() {
        let line = line.expect("Could not read line from standard in");
        println!("{}", line);
    }
}

如果您想重用String的分配,可以使用循环形式:

use std::io::{self, Read};

fn main() {
    let stdin = io::stdin();
    let mut stdin = stdin.lock(); // locking is optional

    let mut line = String::new();

    // Could also `match` on the `Result` if you wanted to handle `Err` 
    while let Ok(n_bytes) = stdin.read_to_string(&mut line) {
        if n_bytes == 0 { break }
        println!("{}", line);
        line.clear();
    }
}

答案 1 :(得分:3)

您只需阅读 public class CSVItem { public string SerialNumber { get; set; } public double Input1 { get; set; } public double Input2 { get; set; } public double Input3 { get; set; } public double Input4 { get; set; } public double Input5 { get; set; } public double Input6 { get; set; } public string Input7 { get; set; } public double Input8 { get; set; } }

这是基于the documentation

的示例
Stdin

主要是文档示例包含在循环中,当没有更多输入时突然退出循环,或者是否有错误。

其他更改是在您的上下文中将错误写入use std::io; fn main() { loop { let mut input = String::new(); match io::stdin().read_line(&mut input) { Ok(len) => if len == 0 { return; } else { println!("{}", input); } Err(error) => { eprintln!("error: {}", error); return; } } } } 会更好,这就是错误分支使用stderr而不是eprintln!的原因。在撰写该文档时,该宏可能无法使用。

答案 2 :(得分:0)

!===

<强>输出:

use std::io;

fn main() {
    loop {
        let mut input = String::new();
        io::stdin()
            .read_line(&mut input)
            .expect("failed to read from pipe");
        input = input.trim().to_string();
        if input == "" {
            break;
        }
        println!("Pipe output: {}", input);
    }
}