如何防止最后一个参数需要用 clap 引用?
How can I prevent the last argument from needing to be quoted with clap?
我正在使用 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 参数:
.setting(AppSettings::TrailingVarArg)
:表示 clap 应该在最后一个位置参数后停止解析其他 flags/options。
.setting(AppSettings::AllowLeadingHyphen)
:允许参数值带有前导连字符,例如 -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,但在尝试解析参数时出现意外行为。
我的命令行工具应该像这样工作
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 参数:
.setting(AppSettings::TrailingVarArg)
:表示 clap 应该在最后一个位置参数后停止解析其他 flags/options。.setting(AppSettings::AllowLeadingHyphen)
:允许参数值带有前导连字符,例如-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"]