【问题标题】:Fish Shell argparse Doing Something Very Unexpected鱼壳 argparse 做了一些非常意外的事情
【发布时间】:2020-07-29 01:28:38
【问题描述】:

我在 OS X 10.14.5 上运行 fish 3.1.0。

我是钓鱼和 argparse 的新手。两个我都喜欢。

以下简单测试代码:

#!/usr/local/bin/fish

function afoo 
    set -l options (fish_opt -s h -l help)
    set options $options (fish_opt -s m -l max --required-val)
    set options $options (fish_opt -s n -l nnn --optional-val)

    argparse $options -- $argv

    echo "max" $_flag_max
    echo "nnn" $_flag_nnn
end

应该创建两个开关 m 和 n。 m 必须取值,而 n 可以取值。

这是在终端的 CLI 中测试该基本功能时的简单屏幕截图:

[/usr/local/bin/fish 3.1.0] ~ afoo -m foo -n baz
max foo
nnn
[/usr/local/bin/fish 3.1.0] ~ afoo -mfoo -nbaz
max foo
nnn baz
[/usr/local/bin/fish 3.1.0] ~ 

为什么 argparse 解析 -n 开关和它的参数之间的空间,但它确实 解析 -m 开关和它的参数之间的空间?

这让我发疯了。我已经阅读了十几遍文档。我做错了什么?

附:开关的顺序无关紧要。

【问题讨论】:

    标签: shell parsing arguments fish


    【解决方案1】:

    为什么argparse不解析-n开关和参数之间的空格,却解析-m开关和参数之间的空格?

    -n 采用 可选 参数。根据 getopt 约定,这些必须直接附加到 option 参数。

    看看例如

    echo never | grep --color never
    

    这不会禁用颜色,而是将颜色设置为 auto(默认无参数值)并查找字符串“never”。所以它会用红色显示“从不”。相反,您必须使用--color=never(或者如果它有一个简短的选项“-c”,那么“-cnever”也可以接受)。

    Argparse 的行为类似于通常的 unix getopt(3) 选项解析,它也在幕后使用,因为这就是系统其余部分的行为方式。

    【讨论】:

      【解决方案2】:

      这是因为n/nnn=? 有一个可选 参数,而m/max= 有一个必需 参数。这些字符串是您调用fish_opt 的输出。

      在成功运行argparse 后,非选项参数存储在$argv 中。所以你的baz 最终是$argv

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-09-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多