为什么选项和参数之间的空格可以省略?

为什么选项和参数之间的空格可以省略?

例如:

xargs -n 1

是相同的

xargs -n1

但如果你看看手册页,该选项列为-n max-args,这意味着应该保留该空间。缩写形式 -n 没有任何内容最大参数

许多其他 Linux 实用程序也会发生这种情况。

这在 Linux 中叫什么?是否所有实用程序都支持缩写形式(但从未在手册页中记录它)?

答案1

当您编写代码的命令行解析位时,您可以指定哪些选项采用参数,哪些选项不采用参数。例如,在接受一个-h选项(例如帮助)和一个-a应该带有参数的选项的 shell 脚本中,您可以这样做

opt_h=0     # default value
opt_a=""

while getopts 'a:h' opt; do
    case $opt in
        h)  opt_h=1 ;;
        a)  opt_a="$OPTARG" ;;
    esac
done

echo "h: $opt_h"
echo "a: $opt_a"

a:h位表示“我期望解析两个选项,-a并且-h,并且-a应该接受一个参数”(它是:告诉a解析器-a接受一个参数的)。

因此,一个选项在哪里结束、它的值从哪里开始以及此后另一个选项从哪里开始,永远不会有任何歧义。

运行它:

$ bash test.sh -h -a hello
h: 1
a: hello

$ bash test.sh -h -ahello
h: 1
a: hello

$ bash test.sh -hahello
h: 1
a: hello

这就是为什么您大多数时候不应该编写自己的命令行解析器来解析选项。

这个例子中只有一种情况比较棘手。解析通常会在第一个非选项处停止,因此当您在命令行上有内容时看起来喜欢的选项:

$ bash test.sh -a hello -world
test.sh: illegal option -- w
test.sh: illegal option -- o
test.sh: illegal option -- r
test.sh: illegal option -- l
test.sh: illegal option -- d
h: 0
a: hello

以下解决了这个问题:

$ bash test.sh -a hello -- -world
h: 0
a: hello

--信号表示命令行选项结束,并且该-world位留给程序执行它想要的任何操作(它位于位置变量之一中)。

顺便说一句,也就是说,如何删除文件名开头带有破折号的文件rm

编辑:

用 C 调用编写的实用程序getopt()(在 参考资料中声明unistd.h)的工作方式几乎相同。事实上,据我们所知,该bash功能getopts可以通过调用 C 库函数来实现getopt()。 Perl、Python 和其他语言都有类似的命令行解析库,并且它们很可能以类似的方式执行解析。

其中一些getoptgetopt类似的库例程也处理“长”选项。这些都是通常前面是双破折号 ( --),而接受参数的长选项通常在等号之后进行,例如实用程序--block-size=SIZE[某些实现] 的选项du(也允许-B SIZE指定相同的内容)。

手册中经常在简短选项及其参数之间显示空格的原因可能是为了可读性。

编辑:真的旧工具(例如ddtar实用程序)的选项前面没有破折号。这纯粹是出于历史原因,也是为了保持与依赖它们以这种方式工作的软件的兼容性。tar最近,该实用程序已经能够使用破折号进行选项。 BSD 手册将tar旧式选项称为“捆绑标志”。

答案2

xargs是 POSIX 实用程序之一。正如 @drewbenn 所评论的,POSIX 记录了选项解析行为最多其实用程序匹配getopt,对其他实现有一些津贴,说12.1 实用参数语法:

本节描述标准实用程序的参数语法,并介绍整个 POSIX.1-2008 中使用的用于描述实用程序处理的参数的术语。

在 POSIX.1-2008 中,使用特殊符号来描述实用程序参数的语法。除非另有说明,所有实用程序描述都使用此表示法,本示例对此进行了说明(请参阅 XCU简单命令):

并得出结论

建议所有未来的实用程序和应用程序都使用这些指南来增强用户的可移植性。一些历史实用程序无法更改(以避免破坏现有应用程序)的事实不应阻止这一未来目标。

在 POSIX 中(请记住,它仅涵盖最常用的实用程序),存在传递操作数的例外情况,这些操作数将是选项在其他实用程序中位置性的参数,或参数特殊语法:

POSIX 允许选修的选项值:

选项参数与选项之间按字符分隔<blank>,除非选项参数包含在'['']'符号中以指示它是可选的。

我不记得哪些 POSIX 实用程序使用了该功能。恩诅咒ticinfocmp公用事业公司将该功能用于级别-v(详细/调试)选项的。

您询问的具体问题在该段落的其余部分中有详细介绍,共分几行。

在 POSIX 之前,ps接受选项的某些实现没有前导连字符。 POSIX 描述在实用程序的描述或语法原理中没有提及:

除了 POSIX 之外,还有长选项实现(例如 GNU获取选择长, 或者X 工具包),使用多种方式将选项的值分离或连接到选项。例如,可以使用标点符号:

--option=value
--option value

根据实现的不同,双破折号可能/可能不用于区分长选项和短选项(getopt):山猫X Toolkit 使用单个破折号;例如, GNUgetopt_long使用双破折号。此外,a+可用于指示选项被否定。

POSIX 的描述似乎没有提及其中任何一个,但您肯定可能会遇到它们。

相关内容