繁体   English   中英

鱼 Shell argparse 做某事非常意外

[英]Fish Shell argparse Doing Something Very Unexpected

我在 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 中测试基本 function 时的简单屏幕截图:

[/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 开关及其参数之间的空格?

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

PS开关的顺序无关紧要。

为什么 argparse 不解析 -n 开关及其参数之间的空格,但它解析 -m 开关及其参数之间的空格?

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

看看例如

echo never | grep --color never

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

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

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

成功运行argparse后,非选项 arguments 存储在$argv中。 所以你的baz最终会出现在$argv中。

太好了,非常感谢。 非常。

如果您是像我这样的新手,您可以通过在堆栈溢出中搜索“getopt space optional argument”来找到有关这些答案指向的更多详细信息。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM