如果没有为强制选项提供参数,zparseopts 将下一个选项作为参数

如果没有为强制选项提供参数,zparseopts 将下一个选项作为参数

我在用zsh 5.4.2。引起问题的函数是:

function zp () {
    zparseopts -E -watch:=o_watch -show=o_show
    echo "show            : $o_show"
    echo "watch           : $o_watch"
}

输出:

$ zp  --show --watch "Watching"
show            : --show
watch           : --watch Watching
    
$ zp  --watch --show 
show            : 
watch           : --watch --show

您可以看到,如果我不传递值--watch(该参数是强制性的),那么在这种情况下它将采用下一个选项--show作为参数。它实际上应该显示一个错误,例如zp:zparseopts:1: missing argument for option: -watch

为什么--watch将其--show作为参数而不是抛出错误?

答案1

作为比较,我很确定 GNU C 函数getopt_long也是这样工作的,例如使用 GNU ls:

$ ls --sort --foo
ls: invalid argument ‘--foo’ for ‘--sort’
Valid arguments are:
...

如果您将参数设置为--walk可选,zparseopts则将采用--watch --show两个参数:

在所有情况下,选项参数必须紧跟在同一位置参数中的选项之后,或者出现在下一个位置参数中。即使是可选参数也可能出现在下一个参数中,除非它以“-”开头。

但似乎用户只需要知道哪些选项带有参数,短选项也会发生这种情况,例如tar -tzftar -tfz.

在我看来,使用(仅)--sort=whatever会使它更清晰,但zparseopts甚至不能真正=直接支持。 (将作为参数值--sort=whatever给出)。=whatever这对于空头期权来说并不适用。

相关内容