2

clap crate 实现了选项的内置行为-h,但它似乎没有为-?. 有没有办法告诉它这样做?

4

3 回答 3

1

我在clap 存储库中打开了一个问题。作者/主要贡献者已经在那里回答了。这是代码的副本,它回答了这个问题:

extern crate clap;

use std::env;
use std::process;

use clap::{App, Arg};

fn main() {
    // We build the App instance and save it, so we can
    // use it later if needed
    let mut app = App::new("prog").arg(
        Arg::with_name("help")
            .short("?")
            .help("Also prints the help message"),
    );

    // We call this method which will do all the
    //parsing, but not consume our App instance
    let res = app.get_matches_from_safe_borrow(env::args_os());

    // This calls all the normal clap error messages
    // if one should exist
    let matches = res.unwrap_or_else(|e| e.exit());

    // Now we check for ?
    if matches.is_present("help") {
        let _ = app.print_help();
        println!(""); // adds a newline
        process::exit(0);
    }

    // Now we can use matches like normal...
}
于 2018-01-23T21:07:23.303 回答
0

从 Clap 2.29.0 开始,没有内置方法可以为同一选项添加多个短名称。

App::help_short允许您覆盖默认-h选项以获得帮助,但尽管该函数接受字符串,但它只关心第一个字符(在去除前导破折号之后)Arg::short同样的事情

您可以将-?选项定义为单独的选项,并通过调用自行处理App::print_help。这将具有-?在帮助文本中单独显示的效果,尽管您可以隐藏该选项。

于 2017-12-11T06:21:32.793 回答
-1

试图将此作为评论,但它不适合。

至少在类 Unix 系统上,您将遇到的另一个问题是大多数 shell 为“?”分配了特殊含义。我有一个 Rust 程序,它只打印出它在命令行上找到的参数。

> $ cargo run one two three
    Finished dev [unoptimized + debuginfo] target(s) in 0.0 secs
     Running `target/debug/cmdl one two three`
["target/debug/cmdl", "one", "two", "three"]
args len: 4
arg: target/debug/cmdl
arg: one
arg: two
arg: three

当我通过它时-?

> $ cargo run -?
zsh: no matches found: -?

-?如果我引用它并放在--它前面,我可以传入:

> $ cargo run -- "-?"
    Finished dev [unoptimized + debuginfo] target(s) in 0.0 secs
     Running `target/debug/cmdl '-?'`
["target/debug/cmdl", "-?"]
args len: 2
arg: target/debug/cmdl
arg: -?

对于寻求帮助的人来说,这似乎有点期待,但也许它在 OP 的平台上更友好。我正在使用 Mac OS X。

更新:

类 Unix 系统上大多数基于 Bourne 的 shell 解释 ? 作为匹配文件名中单个字符的通配符。我不了解鱼,但我查看了下面的 /bin/sh、/bin/ksh、/bin/bash 和 /bin/zsh。

如果你使用 -? 作为这些 shell 的命令行选项,并且工作目录中有一个由连字符后跟一个字符组成的文件名,您的程序将看到文件名而不是“-?” 因为 shell 会在命令行到达您的程序之前进行替换。

一些shell(尤其是zsh)会绊倒-?甚至在检查文件之前,如我的原始消息中所述。

如下图,如果-?用引号括起来,shell 不会弄乱它,但这不是我希望大多数人知道的。当我试图找到一个我不熟悉的程序的帮助页面时,我什至不相信自己会记住这一点。

$ /bin/sh
$ ls
-a      -bb     -ccc    a       bb      ccc
$ echo -?
-a
$ echo ?
a
$ echo ??
-a bb
$ echo "-?"
-?

$ /bin/ksh
$ ls
-a      -bb     -ccc    a       bb      ccc
$ echo ?
a
$ echo -?
-a
$ echo ??
-a bb
$ echo "-?"
-?

$ /bin/bash
$ ls
-a      -bb     -ccc    a       bb      ccc
$ echo ?
a
$ echo -?
-a
$ echo ??
-a bb
$ echo "-?"
-?

$ /bin/zsh
$ ls
-a   -bb  -ccc a    bb   ccc
$ echo ?
a
$ echo -?
-a
$ echo ??
-a bb
$ echo "-?"
-?
于 2018-01-16T01:17:14.253 回答