将选项传递给程序:一个破折号与两个破折号的约定是什么?

Clo*_*boy 7 linux unix terminal macos

一些程序将采用如下选项:

$ someprogram -orange apple
Run Code Online (Sandbox Code Playgroud)

其他程序会使用这样的东西:

$ otherprogram --orange apple
Run Code Online (Sandbox Code Playgroud)

在 Linux/Unix/OSX 中是否有“规则”或约定?

use*_*686 22

最常见的是 GNUgetopt风格,一个短划线代表短选项,两个短划线代表长选项。


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

    ls -laF
    
    ls -l -a -F
    
    Run Code Online (Sandbox Code Playgroud)

    上面的两个命令是相等的。

    当一个选项接受一个值时,它会覆盖捆绑: In gpg -aofoo.gpg-a并且-o是选项并且foo.gpg是给定的值-o

  • 无论如何,他们中的大多数人做到了。

    tar cvzf是常见的景象。当前版本也接受tar -cvzf,并且根据您是否添加破折号,参数将以非常不同的方式解释。例如,这两个意思是一样的(注意如何dashless选项立即其价值前):

    tar -xf file.tgz -vzO /etc/passwd /var/backups
    
    Run Code Online (Sandbox Code Playgroud)
    tar xfvzO file.tgz /etc/passwd /var/backups
    
    Run Code Online (Sandbox Code Playgroud)

    BSDps总是使用-; SysVps从来没有。Linux 版本接受这两个版本,并根据选项是否以破折号为前缀来更改其行为。(与上面的 tar 示例不同, ps 也会更改选项的含义。)

  • X11 程序使用以单个破折号或加号开头的长选项:

    xterm -class FooTerm +vb -u8
    
    Run Code Online (Sandbox Code Playgroud)

    这将设置选项classu8,并取消设置vb选项。

    X11 样式与选项捆绑不兼容。

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

    gpg -se --no-armor --output=signed.gpg
    
    Run Code Online (Sandbox Code Playgroud)

    这将设置-s-e、 和--no-armor(与 相反--armor)。

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

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

  • POSIX 规范有一节Utility Argument Syntax,它描述了单字符选项。


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

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


gee*_*aur 5

通常第一个是在旧程序中发现的,这些程序根深蒂固而无法改变。那些长选项与标准getopt()功能不兼容。

第二种样式是由 GNU 引入的getopt_long(),并且符合现有标准,这些标准期望第一种样式捆绑短选项(即,-orange预期意味着-o -r -a -n -g -e)。强烈推荐这种多头期权风格。

  • 就我所见,约定是将所有选项都作为 --word 可用,将最常用的选项作为 -x -y -z 等以及 --word (2认同)
  • 那些讨厌的 X11 选项 - 它们应该被带到外面并反复显示我的靴子的脚趾。 (2认同)