1

我是 Rust 的新手,我一直在写一些练习应用程序。我正在尝试使用 Clap 接受命令行参数。下面的代码接受一个字符串和一个数字并将它们打印出来,如下所示:

$ cargo run "this is a test" -n11
this is a test
11

这很好用,但我希望能够像这样通过管道输入代替字符串:

$ echo "this is a test" | cargo run -- -n11
this is a test
11

尝试这样做会产生:

error: The following required arguments were not provided:
    <INPUT>

USAGE:
    clap_sample --num <num> <INPUT>

For more information try --help

我可以像这样使用 xargs 解决这个问题:

$ echo "this is a test" | xargs -d '\n' cargo run -- -n11

有没有更好的方法来做到这一点,这样我就可以在仍然使用 -n 选项的同时接受管道中的字符串?提前致谢。

  use clap::{Arg, App}; 
  
  fn main() {
     let matches = App::new("Clap Sample")
         .arg(Arg::new("INPUT")
             .required(true)
             .index(1))
         .arg(Arg::new("num")
             .short('n')
             .long("num")
             .takes_value(true))
         .get_matches();
 
     let usr_string = matches.value_of("INPUT").unwrap();
     let key: u8 = matches.value_of("num").unwrap()
         .parse()
         .expect("NaN :(");
 
     println!("{}", usr_string);
     println!("{}", key);
 }

额外的问题: 如果我使用 xargs 管道输入字符串,我可以在字符串中添加换行符(分隔符设置为 \0),它们会反映在输出中。如果我在没有 echo 和 xargs 的情况下直接传递它,则输出中会显示文字 '\n'。有没有办法在直接运行时表示换行符?

4

1 回答 1

0

您的代码正在检查命令行的参数,它没有读取标准输入。使用xargsget 将输入从管道移动到命令行是一种很好的方法。

echo -n "this is a test" | xargs cargo run -- -n11 

您拥有的另一个选择是更改您的程序,以便在没有user_string给出参数的情况下从标准输入读取。这是阅读标准输入的一个很好的起点https://doc.rust-lang.org/std/io/struct.Stdin.html

您还应该在unwrap()此处替换:

 let key: u8 = matches.value_of("num").unwrap()

检查是否给出了参数,因为它不是.required(true)例如

if let Some(key) = matches.value_of("num")

或者也许有unwrap_or("0")

于 2022-01-18T02:53:23.187 回答