带参数的块 [-abc] 中的单字符开关

带参数的块 [-abc] 中的单字符开关

假设您有一个命令foo需要三个单字符开关abc。所有这些开关都有多种选择。

IEfoo -a opt1 -b opt2 -c opt3

当开关位于单个块中时会发生什么(或应该发生什么)?

IEfoo -abc opt1 opt2 opt3

是否有发生的情况的标准实践(即cgets opt1 opt2 opt3,或agets bc opt1 opt2 opt3,或抛出错误等),还是由程序解释它?

答案1

在使用 的程序中getopt(),if-a接受一个参数,那么foo -abc opt1 opt2 opt3is-a带有该参数bc,然后是非选项opt1, opt2, opt3。如果-a不接受参数,则行为取决于 if-b-c接受参数。

POSIX 描述getopt()关于这一点比较清楚:

如果该选项带有参数,获取选择() 应设置变量选项参数指向选项参数,如下所示:

  1. 如果选项是元素指向的字符串中的最后一个字符精液, 然后选项参数应包含下一个元素精液, ...
  2. 否则,选项参数应指向该元素中选项字符后面的字符串精液...

但这并不是说可能没有程序以不同的方式做事。传递参数的传统方法是将tar所有标志放入第一个命令行参数中的包中,并将所有必需的参数按顺序放入以下命令行参数中的选项。

在这个例子中来自FreeBSD tar 手册:

tar tbf 32 file.tar

b标志f接受参数,这里是32file.tar。当然,这种模式相当独特,因为参数是不是前面有破折号。使用破折号会导致更像getopt- 的解析,这意味着tar xfvtar -xfv是不同的(因为-f需要一个参数)。

当然,有些程序采用完整单词的选项,但仍然以一个破折号开头,因此在不知道相关程序的情况下,无法判断是-abc一个选项、三个选项还是一个带参数的选项。 GNU 风格在长选项前面加上双破折号至少使区别变得清晰。

答案2

POSIX 标准说:

准则 5:当组合在一个“-”分隔符后面时,应该接受一个或多个没有选项参数的选项,后跟最多一个带有选项参数的选项。

因此,在符合 POSIX 标准的实用程序中,foo -abc opt1 opt2 opt3意味着:

  • -abc带有选项参数的选项。
  • opt1opt2opt3作为标准参数。

如果foo不是符合 POSIX 标准的实用程序,则其手册应阐明这些情况。

答案3

这完全取决于解释您输入的程序。

通常,您可以将短选项链接在一起(例如foo -abc),只要这些选项不带参数即可。这既符合惯例,也是因为标准参数解析库(例如 getopts)支持这一点。

但是,我不知道有任何常用程序不支持链接短选项。

相关内容