似乎大多数(很多)命令都实现了这样的选项参数:
如果短选项需要选项参数,则该选项由选项参数的空格分隔,例如
$ head -n 10
如果long选项需要选项参数,则该选项由选项参数中的=
分隔,例如
$ head --lines=10
这是某种惯例吗?是的,我在哪里可以找到它?除此之外,是什么原因?
为什么例如是不是
$ head --lines 10
答案 0 :(得分:26)
短期选择基本原理记录在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 - | ...
第一个独奏短跑意味着写入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添加 - 谢谢;我同意。)