History

為什麼“論點可以反對選擇權”勝過“論點總是分開的”?

  • June 27, 2016

受最近問題的啟發為什麼特定的選項順序對 tar 命令很重要?,其中提問者知道為什麼tar -cfv test.tar *.jpg不起作用,我想問一個後續:認真的,為什麼不呢?

當命令有一個-f需要參數的選項和一個不需要參數的選項-v時,這:

cmd -fv foo

可以用兩種不同的方式解釋:v-f選項的參數並且foo是非選項參數,或者foo是選項的參數-f並且-v存在選項。第一種解釋是 POSIXgetopt()所做的,因此有很多命令都以這種方式執行。

我一直更喜歡第二種解釋。將所有選項打包在一起(無論它們是否接受參數)似乎比將其壓扁foo-f變成. 但這種行為幾乎不再存在。我最近使用的唯一命令是 Java 的(它的語法明顯受到 Sun 版本的接受的啟發)。-f foo``-ffoo``jar``tar``tar cfv tarfile ...

Xlib 有一個getopt-like 函式,XrmParseCommand它允許將選項指定為採用“單獨”參數或“粘性”參數。但它處理長選項(-display,-geometry等),因此它-fv只是另一個與-for無關的選項-v。所以這不是我第二種解釋的例子。

壓扁的 args 何時以及為何成為主導?是在 POSIX 之前就已經解決了,還是 POSIX 授權決定了這個問題?POSIX 的第一個版本甚至與目前版本有相同的特定要求嗎?古代有沒有關於這個話題的存檔討論?

是否有任何其他命令(除了tarand jar)支持或歷史上支持-fv foo=-f foo -v選項解析的樣式?

首先,在標準getopt()風格的參數處理中,參數不必針對它們適用的選項進行壓縮,它們只是可以。因此,如果-f接受參數,則以下兩個都是有效的:

command -ffoo positional arguments
command -f foo positional arguments

你所謂的“第二種解釋”實際上非常非常罕見。據我現在所能想到的,tar並且mt是唯一可以以這種方式工作的現存命令……而且,正如你提到jar的, ,但這只是因為它模仿tar. getopt()這些命令處理參數與標準樣式非常不同。這些選項甚至都沒有-!我不能確定為什麼它很少使用,但我猜這是因為很難說出哪些選項與哪些參數相匹配。例如,如果bandd帶參數但是a,cedon’t,那麼你有這個:

command abcde b-argument d-argument

…這意味著當您編寫命令時,您必須回顧選項字母組,再次閱讀它,記住您指定的哪些選項需要參數,並以相同的順序寫出參數。那這個呢?

command adcbe b-argument d-argument

糟糕,d選項得到了b-argument,反之亦然。更糟糕的是,如果您看到:

command lmnop foo bar baz

…而且您不熟悉該命令,您不知道哪些參數與哪些選項一起使用。foo, bar, andbaz可能是n, o, 的參數p(並且landm不帶參數)或者fooand可能與bar,比如while是一個位置參數……或許多其他可能的組合。m``p``baz

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