為什麼“論點可以反對選擇權”勝過“論點總是分開的”?
受最近問題的啟發為什麼特定的選項順序對 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
只是另一個與-f
or無關的選項-v
。所以這不是我第二種解釋的例子。壓扁的 args 何時以及為何成為主導?是在 POSIX 之前就已經解決了,還是 POSIX 授權決定了這個問題?POSIX 的第一個版本甚至與目前版本有相同的特定要求嗎?古代有沒有關於這個話題的存檔討論?
是否有任何其他命令(除了
tar
andjar
)支持或歷史上支持-fv foo
=-f foo -v
選項解析的樣式?
首先,在標準
getopt()
風格的參數處理中,參數不必針對它們適用的選項進行壓縮,它們只是可以。因此,如果-f
接受參數,則以下兩個都是有效的:command -ffoo positional arguments command -f foo positional arguments
你所謂的“第二種解釋”實際上非常非常罕見。據我現在所能想到的,
tar
並且mt
是唯一可以以這種方式工作的現存命令……而且,正如你提到jar
的, ,但這只是因為它模仿tar
.getopt()
這些命令處理參數與標準樣式非常不同。這些選項甚至都沒有-
!我不能確定為什麼它很少使用,但我猜這是因為很難說出哪些選項與哪些參數相匹配。例如,如果b
andd
帶參數但是a
,c
和e
don’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
(並且l
andm
不帶參數)或者foo
and可能與bar
,比如while是一個位置參數……或許多其他可能的組合。m``p``baz