Rust 我怎样才能避免最后一个论点需要用clap引用?
我正在使用clap,在尝试解析参数时,我得到了一个意外的行为 我的命令行工具应该是这样工作的 福佑 e、 g: 福乌杰克回声酒店 傅-u保罗ls-al 我需要获得诸如user之类的选项,但它本身,我需要是args的其余部分 下面的代码会导致一种行为,我无法获取的值,除非它被引用: 福乌杰克回声酒店 错误:找到参数“s”,该参数不是预期的,或者在此上下文中无效 鉴于此方法效果良好: foo-u jack'echo's' 有没有办法避免引用 让matches=App::newfoo .版本0.1 阿格先生 Arg::使用_nameuser 肖图先生 朗瑟先生 .requiredtrue .这是真的, 阿格先生 Arg::with_name命令 .help要运行的命令 .requiredtrue .这是真的, .找一对火柴;Rust 我怎样才能避免最后一个论点需要用clap引用?,rust,clap,Rust,Clap,我正在使用clap,在尝试解析参数时,我得到了一个意外的行为 我的命令行工具应该是这样工作的 福佑 e、 g: 福乌杰克回声酒店 傅-u保罗ls-al 我需要获得诸如user之类的选项,但它本身,我需要是args的其余部分 下面的代码会导致一种行为,我无法获取的值,除非它被引用: 福乌杰克回声酒店 错误:找到参数“s”,该参数不是预期的,或者在此上下文中无效 鉴于此方法效果良好: foo-u jack'echo's' 有没有办法避免引用 让matches=App::newfoo .版本0.1 阿
我还打开了一个.默认情况下,clap将只解析任何参数一次。这意味着在-u jack echo s中,它将解析-u jack作为用户选项,echo作为命令参数,并且有一个参数s,它不知道该如何处理,因此它不是预期的 要检索所有尾随参数,需要在case命令的最后一个参数上设置,以便它解析所有剩余参数。 另外,在clap命令上设置以下选项,以避免将其余参数解析为clap参数: :指示clap应在最后一个位置参数之后停止对其他标志/选项的分析。 :允许使用前导连字符(如-al)的参数值。 下面是一个例子:
let matches = App::new("foo")
.version("0.1")
.setting(clap::AppSettings::TrailingVarArg)
.setting(clap::AppSettings::AllowLeadingHyphen)
.arg(
Arg::with_name("user")
.short("u")
.long("user")
.required(true)
.takes_value(true),
)
.arg(
Arg::with_name("command")
.help("The command to run")
.required(true)
.takes_value(true)
.multiple(true),
)
// parse as if program ran as: foo -u paul ls -al
.get_matches_from(&["foo", "-u", "paul", "ls", "-al"]);
let command: Vec<&str> = matches.values_of("command").unwrap().collect();
println!("{:?}", command); // ["ls", "-al"]
默认情况下,clap只解析任何参数一次。这意味着在-u jack echo s中,它将解析-u jack作为用户选项,echo作为命令参数,并且有一个参数s,它不知道该如何处理,因此它不是预期的 要检索所有尾随参数,需要在case命令的最后一个参数上设置,以便它解析所有剩余参数。 另外,在clap命令上设置以下选项,以避免将其余参数解析为clap参数: :指示clap应在最后一个位置参数之后停止对其他标志/选项的分析。 :允许使用前导连字符(如-al)的参数值。 下面是一个例子:
let matches = App::new("foo")
.version("0.1")
.setting(clap::AppSettings::TrailingVarArg)
.setting(clap::AppSettings::AllowLeadingHyphen)
.arg(
Arg::with_name("user")
.short("u")
.long("user")
.required(true)
.takes_value(true),
)
.arg(
Arg::with_name("command")
.help("The command to run")
.required(true)
.takes_value(true)
.multiple(true),
)
// parse as if program ran as: foo -u paul ls -al
.get_matches_from(&["foo", "-u", "paul", "ls", "-al"]);
let command: Vec<&str> = matches.values_of("command").unwrap().collect();
println!("{:?}", command); // ["ls", "-al"]
请借此机会在system3语义和Execute2语义之间做出选择,system3语义需要一个带shell命令的参数,如su、ssh,而Execute2语义需要多个单独的参数,如sudo、xargs、find。不要试图接受这两个版本,它只是脆弱和混乱的。@TheotherGuy我会读到的!谢谢你的信息!我知道这些模式,但不知道它们有名称/规格。令人惊叹的请借此机会在system3语义和Execute2语义之间做出选择,system3语义需要一个带shell命令的参数,如su、ssh,而Execute2语义需要多个单独的参数,如sudo、xargs、find。不要试图接受这两个版本,它只是脆弱和混乱的。@TheotherGuy我会读到的!谢谢你的信息!我知道这些模式,但不知道它们有名称/规格。令人惊叹的部分工作,因此如果您尝试使用标志的东西不工作,不幸的是,例如:foo-u jack ls-al由于结尾处的-al而失败。@MarceloBoeira要区分参数和选项,可以使用双破折号-,在这之后,所有参数都不会被解释为选项:foo-u jack-ls-al。它还可以告诉clap在第一个非选项参数之后不要解析选项,但我不确定。我实际上正在考虑删除clap,因为没有它似乎更容易做到,做一些类似foo用户的事情command@MarceloBoeira查看文档,它看起来正是这样做的。它不是那么简单,后面的VarArg允许这样做,但您仍然需要自己进行一些解析…部分工作正常,因此如果您尝试使用标志的操作,不幸的是,例如:foo-u jack ls-al因结尾处的-al而失败。@MarceloBoeira要区分参数和选项,可以使用双破折号-,在双破折号-,之后所有参数都不会被解释为选项:foo-u jack-ls-al。它还可以告诉clap在第一个非选项参数之后不要解析选项,但我对此并不确定。我实际上正在考虑放弃clap,因为如果没有它,做一些像FooUser这样的事情似乎更容易command@MarceloBoeira查看文档,它看起来就是这么做的。它不是那么简单,后面的VarArg允许这样做,但您仍然需要自己进行一些解析。。。