例如:
xargs -n 1
是相同的
xargs -n1
但是,如果您查看手册页,该选项将列为-n max-args
,这意味着应该保留该空间。缩写形式-n max-args没有任何意义。
其他许多Linux实用程序也会发生这种情况。
在Linux中这叫什么?是否所有实用程序都支持缩写形式(但切勿在手册页中对其进行文档化)?
例如:
xargs -n 1
是相同的
xargs -n1
但是,如果您查看手册页,该选项将列为-n max-args
,这意味着应该保留该空间。缩写形式-n max-args没有任何意义。
其他许多Linux实用程序也会发生这种情况。
在Linux中这叫什么?是否所有实用程序都支持缩写形式(但切勿在手册页中对其进行文档化)?
Answers:
当您编写代码的命令行解析位时,您可以指定哪些选项带有参数,哪些不带参数。例如,在接受一个-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和其他语言具有相似的命令行解析库,并且很有可能它们以相似的方式执行解析。
其中一些的getopt
和getopt
式的库函数也处理“长”选项。这些通常以双破折号(--
)开头,并且带有参数的长选项通常在等号后才这样做,例如--block-size=SIZE
,du
实用程序[的某些实现]的选项(还允许-B SIZE
指定相同的内容)。
编写手册的原因通常是在简短选项之间显示空格,而其参数可能是为了便于阅读。
编辑:真正的旧工具,例如dd
和和tar
实用程序,在它们前面都带有短划线的选项。这纯粹是出于历史原因,并且是为了保持与依靠它们以这种方式工作的软件的兼容性。该tar
实用程序最近获得了使用破折号进行选择的功能。BSD手册用于tar
调用“捆绑标志”的旧选项。
getopt()
(在中声明了unistd.h
),所以执行相同的操作。
-a
具有可选参数,-ab
则与相同-a -b
)。当遇到非标记时,GNU getopt不会停止标记处理:(默认情况下)相反,而是将标记重新排列到argv的前面。
xargs
是POSIX实用程序之一。正如@drewbenn所评论的那样,POSIX记录了其大多数实用程序要匹配的选项解析行为getopt
,并为其他实现提供了一些余地,如12.1实用程序参数语法所示:
本节描述了标准实用程序的参数语法,并介绍了整个POSIX.1-2008使用的术语,用于描述由实用程序处理的参数。
在POSIX.1-2008中,使用特殊符号来描述实用程序参数的语法。除非另有说明,否则所有实用程序描述都使用此符号,此示例对此进行了说明(请参见XCU 简单命令):
并与
建议所有将来的实用程序和应用程序都使用这些准则来增强用户的可移植性。某些历史实用程序无法更改(以避免破坏现有应用程序)的事实不应阻止此未来目标。
在POSIX(记住,这仅覆盖了最常用的实用工具),还有一些通过操作数这将是例外选项在其他公用事业无论是位置参数,或者参数特殊语法:
POSIX允许可选的选项值:
选项参数以
<blank>
字符分开显示,与选项分开,除非选项参数包含在'['
和']'
表示法中以表明它是可选的。
暂时,我不记得哪个POSIX实用程序使用了该功能。Ncurses程序tic
和infocmp
实用工具使用的功能级别的的-v
(详细/调试)选项。
您询问的具体点在该段的其余部分中进行了详细说明,分几行。
在POSIX之前,ps
接受的选项的某些实现没有前导连字符。POSIX描述未在实用程序描述或语法原理中提及:
除了POSIX之外,还有长选项实现(例如GNU getopt_long或X Toolkit),使用多种方式将选项的值分离或结合到选项中。例如,可以使用标点符号:
--option=value
--option value
根据实现的不同,可能会/可能不会使用双破折号来区分长选项和短选项(getopt):lynx和X Toolkit使用一个破折号;例如,GNU getopt_long
使用双破折号。同样,+
可以使用a 表示选项被否定。
POSIX的描述似乎没有提到任何这些,但是您肯定会遇到它们。
-option=value
认为是--option=value
(长选项格式,两个破折号在开始的一个替代)?