Shell-Script
如果強制選項沒有參數,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
作為參數而不是拋出錯誤?
作為比較,我很確定 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
作為參數值給出)。這對於短期期權並不適用。