gpt4 book ai didi

rust - 如何防止最后一个参数需要用 clap 引用?

转载 作者:行者123 更新时间:2023-11-29 08:12:02 26 4
gpt4 key购买 nike

我正在使用 clap,但在尝试解析参数时出现意外行为。

我的命令行工具应该像这样工作

foo -u <user> <command>

例如:

foo -u jack echo s
foo -u paul ls -al

我需要获取诸如用户之类的选项,但是 <command>本身,我需要成为其余的参数。

下面的代码导致我无法获得 <command> 的值除非它被引用:

foo -u jack echo s
error: Found argument 's' which wasn't expected, or isn't valid in this context

虽然这工作正常:

foo -u jack 'echo s'

有什么办法可以避免引号吗?

let matches = App::new("foo")
.version("0.1")
.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),
)
.get_matches();

我还打开了一个 issue on the clap repository .

最佳答案

默认情况下,clap 只会解析一次任何参数。这意味着在 -u jack echo s 中,它会将 -u jack 解析为“用户”选项,将 echo 解析为“命令”参数,并有一个参数 s 它不知道如何处理(因此它“不是预期的”)。

要检索所有尾随参数,您需要设置 .multiple(true)在最后一个参数上(在你的例子中是“命令”),所以它解析所有剩余的参数。另外在 clap 命令上设置以下选项以避免将剩余参数解析为 clap 参数:

这是一个例子:

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"]

Playground link

关于rust - 如何防止最后一个参数需要用 clap 引用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55345730/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com