是否可以使用GNU getopt忽略未知的可选参数?
我有一个脚本scriptA.sh,它有可选参数--optA, --optB, --optC, --optD
。
我想写一个 Package 器wrapperA,它有两个可选参数--optX and --optY
,用于调用scriptA
。但是,我不想在 Package 器中声明scriptA的所有可选参数。
特别地,如果在wrapperA
中,我用
getopt --longoptions optX:,optY:
电话
wrapperA --optX --optA --optB
返回错误
getopt: unknown option -- optA
GNU getopt是否可以被强制忽略未知参数并将它们放在输出中的'--'之后?
5条答案
按热度按时间gmxoilav1#
不可能告诉GNU getopt忽略未知选项。如果你真的想要这个特性,你必须编写自己的选项解析器。
这并不像忽略未知选项那么简单。如何判断一个未知的选项是否接受参数?
原始脚本的使用示例:
这里
foo
是选项--mode
的参数。而source
是“非选项参数”(有时称为“位置参数”)。Package 器脚本的示例用法:
wrapperscript
中的getopt如何知道它应该忽略--mode
和foo
?如果它只是忽略--mode
,那么originalscript
将获得foo
作为第一个位置参数。一个可行的解决方法是告诉 Package 器脚本的用户在双破折号(
--
)之后写入原始脚本的所有选项。按照惯例,双破折号标记选项的结束。GNUgetopt识别双破折号并停止解析,并将其余部分作为位置参数返回。参见:
i5desfxk2#
我正在做一个类似的事情,发现这可以阻止getopt错误用这些错误来打扰我。基本上只是管道的错误遗忘。
$./www.example.com-s 20140503-i 3-a-b-c blah.sh -s 20140503 -i 3 -a -b -c
yduiuuwa3#
对于
getopt
,至少对于util-linux-2.37.2中的一个,可以忽略STDERR或使用--quiet标志:请注意,退出状态仍然是1,因为
getopt
不能对参数进行验证,因为它不知道您想要忽略哪种错误。0s7z1bwu4#
如果你只想忽略stderr,可以将
2>dev/null
附加到while
的起始行,如下所示。我想你也可以把它用在getopt
上。pcrecxhr5#
我可以解决这个问题。这个想法涉及到在面对未知选项时摆弄
OPTIND
,以便解析可以由getopts
继续。因此,我们需要保持解析的位置,以便可以相应地调整OPTIND
。我使用了一个假设,即遇到未知选项后会跟随一个参数,因此部分
((OPTIND = $parse_index + 2))
,适应您自己的情况。这个假设被证明是脆弱和不包容的,但在这些情况下是有效的。还请注意,在出现错误(缺少参数)的情况下,它仍然会中断。显然,这不是一个普遍和干净的方法,但有助于克服没有其他选择的情况。