如今,POSIX 标准使用getopt() http://pubs.opengroup.org/onlinepubs/9699919799/functions/getopt.html (aka getopt(3) http://linux.die.net/man/3/getopt) 被广泛用作标准符号,但在早期,人们一直在进行试验。在某些机器上,sort
命令不再支持+
符号。然而,各种命令(特别是ar
and tar
) 接受不带任何前缀字符的控件 - 并且dd
(Alok 在评论中提到)完全使用另一种约定。
GNU 约定使用 '--
' 对于长选项(由getopt_long(3) http://linux.die.net/man/3/getopt_long) 已从使用 ' 更改为+
'。当然,X11 软件在多字符选项之前使用单破折号。因此,整个事情就是历史文物的集合,人们正在尝试如何最好地处理它。
POSIX 文档实用约定 http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap12.html除非历史先例更为有力,否则它确实有效。
有哪些类型的期权处理方式?
[有一次,SO 367309 https://stackoverflow.com/questions/367309包含以下材料作为我的答案。最初由 2008-12-15 02:02 提出FerranB https://stackoverflow.com/users/40441/ferranb,但随后被关闭并删除。]
您认识多少种不同类型的选项?我能想到
许多,包括:
- 单字母选项前面有单破折号,有时可分组
没有参数,参数可以附加到选项字母或下一个
参数(很多很多 Unix 命令;大多数 POSIX 命令)。
- 单字母选项前面有单破折号,不允许分组,
必须附加参数(RCS)。
- 单字母选项前面有单破折号,不允许分组,
参数必须是单独的(POSIX SCCS、IIRC 之前的版本)。
- 多字母选项前面有单破折号,参数可以是
附加或在下一个参数中(X11 程序;还有 Java 和 Mac OS X 上具有 NeXTSTEP 遗产的许多程序)。
- 多字母选项前面有单破折号,可以缩写
(Atria Clearcase)。
- 多字母选项前面有一个加号(已过时)。
- 多字母选项前面有双破折号;参数可以跟在“=”之后
或者是独立的(GNU 实用程序)。
- 没有前缀/后缀的选项,某些名称有缩写或
暗示,参数必须是分开的。 (Amiga操作系统
壳 http://www.amigahistory.co.uk/command.html)
对于采用可选参数的选项,有时必须附加该参数 (co -p1.3 rcsfile.c
),
有时它必须跟在“=”符号之后。 POSIX 不支持可选
参数有意义(POSIX getopt() 只允许最后一个参数使用它们)
命令行上的选项)。
所有明智的选项系统都使用由双破折号组成的选项
('--
') 单独表示“选项结束”——以下参数是
“非选项参数”(通常是文件名;POSIX 称它们为“操作数”)
即使他们从
短跑。 (我认为支持这种表示法是必要的。请注意,如果--
前面是一个需要参数的选项,--
将被视为选项的参数,而不是“选项结束”标记。)
许多但并非所有程序都接受单破折号作为文件名来表示
标准输入(通常)或标准输出(偶尔)。有时,
与 GNU 一样tar
',两者都可以在单个命令行中使用:
... | tar -cf - -F - | ...
第一个单独的破折号意味着“写入标准输出”;第二个意思是“读取文件”
来自 stdin' 的名称。
有些程序使用其他约定 - 即选项前面没有
短跑。其中许多都来自 Unix 最古老的时代。例如,
'tar' 和 'ar' 都接受不带破折号的选项,因此:
tar cvzf /tmp/somefile.tgz some/directory
The dd
命令用途opt=value
只:
dd if=/some/file of=/another/file bs=16k count=200
有些程序允许您交错选项和其他参数
完全地; C 编译器、make 和 GNU 实用程序无需运行
环境中的 POSIXLY_CORRECT 就是示例。许多节目都期望
其他参数之前的选项。
注意git
和其他 VCS 命令经常使用混合系统:
git commit -m 'This is why it was committed'
有一个子命令作为参数之一。通常,可以在命令和子命令之间指定可选的“全局”选项。 POSIX 中有这样的例子;这sccs http://pubs.opengroup.org/onlinepubs/9699919799/utilities/sccs.html命令属于此类;您可以争辩说,运行其他命令的一些其他命令也属于此类别:nice
and xargs
我首先想到的是 POSIX;sudo
是一个非 POSIX 示例,如下所示svn
and cvs
.
我对不同的系统没有强烈的偏好。什么时候
选项足够少,然后是具有助记值的单个字母
很方便。 GNU 支持这一点,但建议使用
多字母选项前面有双破折号。
有些事情我确实反对。最糟糕的之一也是一样
选项字母根据其他内容具有不同的含义
选项字母位于其前面。在我的书中,这是禁忌,但我知道
完成该操作的软件的名称。
另一个令人反感的行为是处理方式不一致
参数(特别是对于单个程序,但也在一组内)
程式)。要么需要附加参数,要么需要分离
参数(或允许其中之一),但没有一些选项需要
附加参数和其他需要独立参数的参数。并
关于是否 ' 一致=
' 可用于分隔选项和
的论点。
与很多很多(与软件相关的)事物一样——一致性更重要
比个人的决定更重要。使用自动化工具
标准化论证处理有助于保持一致性。
无论你做什么,请阅读TAOUP 的命令行选项 http://catb.org/~esr/writings/taoup/html/ch10s05.html和
考虑命令行接口标准 http://www.gnu.org/prep/standards/html_node/Command_002dLine-Interfaces.html. (添加者:JF
塞巴斯蒂安——谢谢;我同意。)