将选项传递给程序:一个破折号和两个破折号的惯例是什么?

将选项传递给程序:一个破折号和两个破折号的惯例是什么?

有些程序会采用如下选项:

$ someprogram -orange apple

其他程序会使用类似这样的方法:

$ otherprogram --orange apple

Linux/Unix/OSX 中是否存在此类“规则”或惯例?

答案1

最常见的是 GNUgetopt风格,一个破折号表示短选项,两个破折号表示长选项。


  • 最初,Unix 程序采用单字母选项,前面有一个破折号,并且可以选择捆绑:

    ls -laF
    
    ls -l -a -F
    

    上面两个命令是相同的。

    当选项采用值时,它会覆盖捆绑:在 中gpg -aofoo.gpg-a-o是选项,而foo.gpg是赋予 的值-o

  • 无论如何,大多数人都是这么做的。

    tar cvzf是常见的情况。当前版本tar -cvzf也接受,并且根据是否添加破折号,参数的解释方式会有很大不同。例如,这两个表示相同的意思(请注意无破折号选项不是紧接在它们值之前):

    tar -xf file.tgz -vzO /etc/passwd /var/backups
    
    tar xfvzO file.tgz /etc/passwd /var/backups
    

    北达科他州ps总是使用-系统安全ps永远不会。Linux 版本接受这两个版本,并根据选项是否以破折号为前缀来改变其行为。(与上面的 tar 示例不同,ps 会将选项意义也。

  • X11 程序使用长选项,前面有一个破折号,有时还有一个加号:

    xterm -class FooTerm +vb -u8
    

    这将设置选项classu8,以及取消设置选项vb

    X11 风格与选项捆绑不兼容。

  • getopt()后来,长选项以与单字母选项兼容的方式添加到 GNU 中。

    gpg -se --no-armor --output=signed.gpg
    

    这将设置-s-e--no-armor(与 相对--armor)。

    通常,--output=signed.gpg--output signed.gpg是等效的。(但并非总是如此 - 例如 curl 不接受前者,只接受后者。)

    (如果我没记错的话,+在将其更改为之前,长选项用作前缀--。)

  • POSIX 规范有一个部分实用程序参数语法,描述单字符选项。


大多数 Windows 程序都使用自己的解析器,这让用户抓狂。

  • 有些需要VMS 风格/a /b /c,有些允许 VMS 风格/a/b/c,而有些则更喜欢 Unix 风格/abc
  • 大多数用作/前缀,有些也接受-,其他接受仅有的 -
  • 值可以表示为/foo bar/foo=bar/foo:bar
  • 通常空格可以是/quoted "like this",但有些程序会将 当作"文字字符。(这是让程序自己进行分词的缺点;在 Unix 中,这由 shell 处理。)
  • 跨平台程序可以使用的实现getopt

答案2

第一种情况通常出现在较旧的程序中,这些程序根深蒂固,难以改变。这些较长的选项与标准getopt()功能不兼容。

第二种样式由 GNU 引入getopt_long(),符合现有标准,现有标准要求第一种样式捆绑短选项(即,-orange应为-o -r -a -n -g -e)。强烈建议使用这种长选项样式。

相关内容