假设您有一个命令foo
需要三个单字符开关a
、b
和c
。所有这些开关都有多种选择。
IEfoo -a opt1 -b opt2 -c opt3
当开关位于单个块中时会发生什么(或应该发生什么)?
IEfoo -abc opt1 opt2 opt3
是否有发生的情况的标准实践(即c
gets opt1 opt2 opt3
,或a
gets bc opt1 opt2 opt3
,或抛出错误等),还是由程序解释它?
答案1
在使用 的程序中getopt()
,if-a
接受一个参数,那么foo -abc opt1 opt2 opt3
is-a
带有该参数bc
,然后是非选项opt1
, opt2
, opt3
。如果-a
不接受参数,则行为取决于 if-b
和-c
接受参数。
这POSIX 描述getopt()
关于这一点比较清楚:
如果该选项带有参数,获取选择() 应设置变量选项参数指向选项参数,如下所示:
- 如果选项是元素指向的字符串中的最后一个字符精液, 然后选项参数应包含下一个元素精液, ...
- 否则,选项参数应指向该元素中选项字符后面的字符串精液...
但这并不是说可能没有程序以不同的方式做事。传递参数的传统方法是将tar
所有标志放入第一个命令行参数中的包中,并将所有必需的参数按顺序放入以下命令行参数中的选项。
在这个例子中来自FreeBSD tar 手册:
tar tbf 32 file.tar
和b
标志f
接受参数,这里是32
和file.tar
。当然,这种模式相当独特,因为参数是不是前面有破折号。使用破折号会导致更像getopt
- 的解析,这意味着tar xfv
和tar -xfv
是不同的(因为-f
需要一个参数)。
当然,有些程序采用完整单词的选项,但仍然以一个破折号开头,因此在不知道相关程序的情况下,无法判断是-abc
一个选项、三个选项还是一个带参数的选项。 GNU 风格在长选项前面加上双破折号至少使区别变得清晰。
答案2
准则 5:当组合在一个“-”分隔符后面时,应该接受一个或多个没有选项参数的选项,后跟最多一个带有选项参数的选项。
因此,在符合 POSIX 标准的实用程序中,foo -abc opt1 opt2 opt3
意味着:
-a
bc
带有选项参数的选项。opt1
,opt2
并opt3
作为标准参数。
如果foo
不是符合 POSIX 标准的实用程序,则其手册应阐明这些情况。
答案3
这完全取决于解释您输入的程序。
通常,您可以将短选项链接在一起(例如foo -abc
),只要这些选项不带参数即可。这既符合惯例,也是因为标准参数解析库(例如 getopts)支持这一点。
但是,我不知道有任何常用程序不支持链接短选项。