Rust 有没有一种方法可以使淋病治疗-?和-h一样?

Rust 有没有一种方法可以使淋病治疗-?和-h一样?,rust,command-line-interface,rust-crates,clap,Rust,Command Line Interface,Rust Crates,Clap,clap板条箱实现了-h选项的内置行为,但它似乎对-?不起作用。有没有办法告诉它这样做?从Clap 2.29.0开始,没有内置的方法为同一个选项添加多个短名称 允许您覆盖默认的-h选项以获取帮助,但尽管函数接受字符串。是的 您可以将-?选项定义为一个单独的选项,并通过调用。这将在帮助文本中单独显示-?,尽管您可以选择该选项。尝试将其作为注释,但它不适合 您将遇到的另一个问题是,至少在类Unix系统上是这样,大多数shell都赋予“?”一个特殊的含义。我有一个Rust程序,它只打印出它在命令行上找

clap板条箱实现了
-h
选项的内置行为,但它似乎对
-?
不起作用。有没有办法告诉它这样做?

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

允许您覆盖默认的
-h
选项以获取帮助,但尽管函数接受字符串。是的


您可以将
-?
选项定义为一个单独的选项,并通过调用。这将在帮助文本中单独显示
-?
,尽管您可以选择该选项。

尝试将其作为注释,但它不适合

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

$cargo运行一二三
在0.0秒内完成开发[未优化+调试信息]目标
正在运行'target/debug/cmdl一二三'`
[“目标/调试/cmdl”、“一”、“二”、“三”]
args len:4
arg:target/debug/cmdl
阿格:一个
阿格:两个
阿格:三个
当我通过它时
-?

$cargo run-?
zsh:未找到匹配项:-?
如果我引用它并在它前面加上
--
,我可以传入
-?

$cargo run--“-?”
在0.0秒内完成开发[未优化+调试信息]目标
正在运行'target/debug/cmdl'-?'`
[“目标/调试/cmdl”,“-?”]
args len:2
arg:target/debug/cmdl
arg:-?
对寻求帮助的人来说,这似乎有点高,但在OP的平台上可能会更友好。我正在开发MacOSX

更新:

大多数基于Bourne的shell都是基于类Unix系统的?作为全局通配符,用于匹配文件名中的单个字符。我不知道关于鱼的事,但我在下面签出了/bin/sh、/bin/ksh、/bin/bash和/bin/zsh

如果使用-?作为这些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 "-?"
-?

我在会议上提出了一个问题。作者/主要撰稿人已经回答了这个问题。下面是代码的副本,它回答了问题:

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...
}

谢谢你的帮助,但这两种方法对我都不起作用。第一个听起来像-h将不再工作,这不是我的意图。第二个根本不起作用。我定义了.arg(arg::with_name(“QUESTION_MARK”).short(“?”),但后来当我检查用户是否通过调用值_of(“QUESTION_MARK”)输入了?时,它会返回None…即使这样做有效,在调用.get_matches()之后,它似乎会使用应用程序并返回clap::ArgMatches,它没有打印帮助函数,但只有用法(),这不是我要找的。@KağanKayal在这种情况下,您可能想在Clap的存储库中填充一个新的。基本上,您要求的是能够定义短别名(
Arg
上的
alias
函数仅为
--long
选项语法定义别名).1-不要通过
cargo
运行它,因为cargo有自己的命令行处理。2-大多数shell都有一个特殊的含义-在bash上运行:
/target/debug/echo-?
->
[“/target/debug/echo”,“-?”]
。一个shell有,一个没有。您需要引用一些统计数据来声明“大多数”@Shepmaster:谢谢你就我含糊不清的声明给我打电话。我想我记起了一些关于“?”被shell奇怪地处理的事情。很多年前,我曾试图使用-?来寻求帮助,比如OP,但最终还是弄明白我在更新中指出了什么,并放弃了它。问题是,-?不是一个在类似Unix的系统上使用shell的好选择n Bourne系列,因为文件名匹配可能导致行为不一致。在我的机器上,使用您的Shell集和
echo-?
在每种情况下打印
-?
,因此您的观点是,如果您有一个以破折号开头的文件,那么使用
-?
可能会导致问题?是的。如果您有一个匹配-?(即,以破折号开头并包含另一个字符),-?将返回文件名,而不是“-?”。程序无法控制其运行的环境,并且-?的行为不同(至少在我们讨论的shell集中)取决于当前工作目录的内容。因此,将其用作命令行选项会打开一扇大门,让您发现难以理解的晦涩和怪异的bug。感谢您提供的有趣提示。我对zsh没有任何经验。我使用的是bash、os-x和windows 7终端的混合体。我的反例是tar。这位老手理解-?并且我的第二个例子是python。它同时支持这两种语言。这向我表明-?或-h是开发人员的首选。我希望同时支持这两种语言。