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