有些程序会采用如下选项:
$ 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
这将设置选项
class
和u8
,以及取消设置选项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
)。强烈建议使用这种长选项样式。