带选项参数的短/长选项 - 这是某种惯例吗?

时间:2012-05-30 14:34:05

标签: bash coding-style

似乎大多数(很多)命令都实现了这样的选项参数:

  1. 如果短选项需要选项参数,则该选项由选项参数的空格分隔,例如

    $ head -n 10
    
  2. 如果long选项需要选项参数,则该选项由选项参数中的=分隔,例如

    $ head --lines=10
    
  3. 这是某种惯例吗?是的,我在哪里可以找到它?除此之外,是什么原因?

    为什么例如是不是

        $ head --lines 10
    

1 个答案:

答案 0 :(得分:26)

短期选择基本原理记录在POSIX Utility Conventions中。大多数选项解析器允许值附加'致信(-n10),主要是因为广泛的历史先例。

GNU在Coding Standardsgetopt_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 - | ...

第一个独奏短跑意味着写入stdout&#39 ;;第二种方法是从stdin'中读取文件名。

某些程序使用其他约定 - 也就是说,选项前面没有破折号。其中许多都来自Unix最古老的日子。例如,' tar'和' ar'两者都接受没有短划线的选项,所以:

tar cvzf /tmp/somefile.tgz some/directory

dd命令仅使用opt=value

dd if=/some/file of=/another/file bs=16k count=200

某些程序允许您完全交错选项和其他参数;例如,C编译器,make和在环境中没有POSIXLY_CORRECT运行的GNU实用程序。许多程序希望选项先于其他参数。


git等现代程序似乎越来越多地使用基本命令名称(git),后跟子命令(commit),后跟选项(-m "Commit message") 。这由SCCS命令的sccs接口预先设定,然后由cvs预设,并由svn使用(并且它们都是版本控制系统)。但是,其他大型命令套件在适当时采用相似的风格。


我不喜欢不同系统之间的偏好。当选项足够少时,带有助记符值的单个字母很方便。 GNU支持这一点,但建议使用双字母表后面的多字母选项进行备份。

有些事我反对。其中一个最差的是使用不同含义的相同选项字母,具体取决于其前面的其他选项字母。在我的书中,这是一个禁忌,但我知道软件在哪里完成。

另一个令人反感的行为是处理参数的风格不一致(特别是对于单个程序,但也在一套程序中)。要么附加参数要么需要分离参数(或允许其中任何一个),但是没有一些选项需要附加参数,而其他参数需要分离参数。并确定是否='可用于分隔选项和参数。

与许多(与软件相关的)事情一样 - 一致性比个人决策更重要。


无论您做什么,请阅读TAOUP's Command-Line Options并考虑Standards for Command Line Interfaces。 (J F Sebastian添加 - 谢谢;我同意。