Shell-Script

如果強制選項沒有參數,zparseopts 將下一個選項作為參數

  • June 16, 2020

我正在使用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作為參數而不是拋出錯誤?

作為比較,我很確定 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作為參數值給出)。這對於短期期權並不適用。

引用自:https://unix.stackexchange.com/questions/593193