2012-05-30 25 views
12

似乎大多數(很多)命令執行選項參數是這樣的:選項參數的短/長選項 - 這是一種約定嗎?

  1. 如果短選項需要一個選項參數,此選項是通過從選項參數,例如一個空格分隔

    $ head -n 10 
    
  2. 如果長時間選項需要一個選項參數,該選項是由=從選項參數,例如分離

    $ head --lines=10 
    

這是某種約定的,是的,我在哪裏可以找到它?此外,理由是什麼?

爲什麼例如是不是

$ head --lines 10 

+4

許多長選項的命令的等號都是可選的。例如,GNU'head'和'grep'。從'man getopt_long':「長選項可能需要一個參數,形式爲--arg = param或--arg param。」各個實用程序的手冊頁通常不會記錄等號是可選的。 –

+1

@DennisWilliamson在長選項參數不是可選的(因此不等於空白)之前等於符號如果參數本身是可選的,如果沒有指定具有默認值。考慮'ls --color'默認的'alw [ays]'。在該示例中省略等號將使得輸入被認爲是該命令的文件或目錄。 – Chinggis6

+1

@ Chinggis6:這取決於實用程序和選項。你的'ls'的例子需要等號,但考慮:'echo foo | grep --regexp o' - 與'--max-count'一樣,它可以與或不等於一樣。但是,'grep --color'需要相等! –

回答

24

短期選項基本原理記錄在POSIX Utility Conventions中。大多數選項解析器允許將該值附加到該字母(-n10)上,主要是因爲具有廣泛的歷史先例。

GNU在其Coding Standards和手冊頁getopt_long()中指定了長選項的基本原理。


從前很久以前,在不久前的StackOverflow,有一個關於command option styles問題。不是一個好問題,但我認爲答案拯救了它(但我承認偏見)。無論如何,它已被刪除,所以我要在這裏恢復我的答案,因爲(a)重新發現答案是一個痛苦的過程,(b)它有與選項有關的有用信息。

您認識多少種不同類型的選項?我能想到的很多,包括:由單一的破折號前面

  • 單字母選項,可分組時沒有參數,參數可以連接到選項字母或一個參數(很多很多的Unix命令;大多數POSIX命令)。
  • 單字母選項前加單個破折號,不允許分組,參數必須附加(RCS)。
  • 單字母選項前面有單個破折號,不允許分組,參數必須分開(POSIX SCCS,IIRC之前)。
  • 以單個破折號開頭的多字母選項,參數可以附加在下一個參數(X11程序)中。
  • 多字母選項前加單個破折號,可縮寫爲(Atria Clearcase)。
  • 多字母選項前加單加(過時)。
  • 多字母選項前加雙破折號;參數可以跟隨'='或單獨(GNU實用程序)。
  • 沒有前綴/後綴的選項,有些名稱有縮寫或暗含,參數必須是分開的。(AmigaOS Shell,通過加入porneL

選項服用一個可選的參數有時必須連接,有時必須遵循一個「=」標誌。 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

+1 WOW!這個答案提供了我所能想到的一切!感謝您投入的時間和精力! – helpermethod