似乎大多數(很多)命令執行選項參數是這樣的:選項參數的短/長選項 - 這是一種約定嗎?
如果短選項需要一個選項參數,此選項是通過從選項參數,例如一個空格分隔
$ head -n 10
如果長時間選項需要一個選項參數,該選項是由
=
從選項參數,例如分離$ head --lines=10
這是某種約定的,是的,我在哪裏可以找到它?此外,理由是什麼?
爲什麼例如是不是
$ head --lines 10
?
似乎大多數(很多)命令執行選項參數是這樣的:選項參數的短/長選項 - 這是一種約定嗎?
如果短選項需要一個選項參數,此選項是通過從選項參數,例如一個空格分隔
$ head -n 10
如果長時間選項需要一個選項參數,該選項是由=
從選項參數,例如分離
$ head --lines=10
這是某種約定的,是的,我在哪裏可以找到它?此外,理由是什麼?
爲什麼例如是不是
$ head --lines 10
?
短期選項基本原理記錄在POSIX Utility Conventions中。大多數選項解析器允許將該值附加到該字母(-n10
)上,主要是因爲具有廣泛的歷史先例。
GNU在其Coding Standards和手冊頁getopt_long()
中指定了長選項的基本原理。
從前很久以前,在不久前的StackOverflow,有一個關於command option styles問題。不是一個好問題,但我認爲答案拯救了它(但我承認偏見)。無論如何,它已被刪除,所以我要在這裏恢復我的答案,因爲(a)重新發現答案是一個痛苦的過程,(b)它有與選項有關的有用信息。
您認識多少種不同類型的選項?我能想到的很多,包括:由單一的破折號前面
選項服用一個可選的參數有時必須連接,有時必須遵循一個「=」標誌。 POSIX不支持有意義的可選參數(POSIX getopt()僅允許它們作爲命令行中的最後一個選項)。
所有敏感選項系統都使用由雙短劃線('--
')組成的選項來表示「選項結束」 - 以下參數是「非選項參數」(通常是文件名),即使它們以一個短劃線。 (我認爲支持這種表示法是必要的)。請注意,如果您有一個命令cmd
並且選項-f
需要參數,那麼如果您使用--
代替參數調用它(cmd -f -- -other
,許多版本的getopt()
將視爲--
爲-f
,然後將文件名解析-other
作爲常規選項,也就是說,--
不會終止的選擇,如果它被解釋爲一個參數傳遞給另外一個選擇。
很多,但不是所有的程序接受單一破折號一個文件名意味着標準輸入(通常)或標準輸出(偶爾)。有時,與GNU'tar
'一樣,兩者都可以用在單一命令行中:
tar -cf - -F - | ...
第一個獨奏短劃線表示'寫入標準輸出';第二種方法是「從標準輸入讀取文件名」。
某些程序使用其他約定—即選項不以破折號開頭。其中許多是來自Unix最古老的日子。例如,「焦油」和「AR」都接受沒有一個破折號選項,所以:
tar cvzf /tmp/somefile.tgz some/directory
的dd
命令使用opt=value
獨家:
dd if=/some/file of=/another/file bs=16k count=200
有些程序允許您交錯選項和其他參數徹底; C編譯器,make和GNU工具在環境中運行時沒有POSIXLY_CORRECT就是例子。許多程序期望這些選項先於其他參數。
現代程序如git
日益似乎使用後面緊跟着選項(-m "Commit message"
)的子命令(commit
)基礎命令名(git
)。這是通過接口到SCCS命令的sccs
,然後由cvs
進行的,並且也被svn
使用(並且它們都是版本控制系統)。但是,其他大型命令套件在看起來合適時採用相似的樣式。
我在不同的系統之間沒有很強的偏好。當有足夠的選項時,帶有助記符值的單字母很方便。 GNU支持這一點,但建議用雙字母前面的多字母選項進行備份。
有一些事情我反對。其中最糟糕的是相同的選項字母使用不同的含義,具體取決於其他選項字母之前的選項。在我的書中,這是一個禁忌,但我知道軟件在哪裏完成。
另一個令人反感的行爲是處理參數風格(特別是對於單個程序,而且在一組程序中)的不一致。要麼需要附加的參數,要麼需要分離的參數(或允許),但沒有一些需要附加參數的選項和其他需要分離參數的選項。並且可以使用'=
'來區分選項和參數。
與許多許多(軟件相關的)事物一致性比個體決定更重要。
不管你做什麼,請閱讀TAOUP's Command-Line Options並考慮Standards for Command Line Interfaces。 (添加J F Sebastian —謝謝;我同意)
+1 WOW!這個答案提供了我所能想到的一切!感謝您投入的時間和精力! – helpermethod
許多長選項的命令的等號都是可選的。例如,GNU'head'和'grep'。從'man getopt_long':「長選項可能需要一個參數,形式爲--arg = param或--arg param。」各個實用程序的手冊頁通常不會記錄等號是可選的。 –
@DennisWilliamson在長選項參數不是可選的(因此不等於空白)之前等於符號如果參數本身是可選的,如果沒有指定具有默認值。考慮'ls --color'默認的'alw [ays]'。在該示例中省略等號將使得輸入被認爲是該命令的文件或目錄。 – Chinggis6
@ Chinggis6:這取決於實用程序和選項。你的'ls'的例子需要等號,但考慮:'echo foo | grep --regexp o' - 與'--max-count'一樣,它可以與或不等於一樣。但是,'grep --color'需要相等! –