我经常发现自己编写的 shell 函数或 shell 脚本旨在包装其他命令。
我也经常希望这样的包装器支持一些标志/选项。这个想法是,包装器应该从命令行参数中剔除它支持的所有标志/选项(以及它们的参数,如果适用),并将剩余的参数作为参数传递给包装的命令。
现在,包装命令通常还支持其自己的标志和选项。这意味着,根据上述方案,包装器必须能够处理命令行参数,其中包括其自己的标志/选项以及包装命令支持的标志/选项。
实现这种包装器的一种方法是在调用 GNU 时指定包装器和包装命令的选项getopt
,然后将所有后者以及任何非选项参数收集在某个 array 中WRAPPED_COMMAND_ARGUMENTS
。然后,在稍后的某个时间,包装的命令将"${WRAPPED_COMMAND_ARGUMENTS[@]}"
作为其命令行参数被调用。
这种方法对我来说相当有效,但是当包装的命令有很多选项时,它就会变得异常费力。
相反,我想在这篇文章的标题中找到我所说的“GNU 的宽容替代方案getopt
”。我指的是这样一个工具,它getopt
可以帮助我解析我明确告诉它的选项,并平等地对待所有其他剩余参数,即不根据前导连字符的存在与否进行区分。
有这样的事吗?
答案1
此类任务的常见方法是用作--
包装器脚本处理的选项和逐字传递给包装器正在执行的程序的选项之间的分隔符,例如
./my-wrapper -a -b -c -- -d -e -f
--
标志着 选项的结束my-wrapper
。所有其他参数以及 后面的所有选项都--
可以传递给它包装的程序,您的包装器脚本根本不需要处理它们。
它还允许选项的冲突使用 - 例如grep
,许多其他程序使用-i
意味着搜索应该不区分大小写,而您可能希望-i
在包装器脚本中使用来指定输入文件。通过使用--
,不会发生冲突 -在表示“输入文件”-i
之前,在表示“不区分大小写”之后。--
-i
--
另外值得注意的是:您包装的程序也可能解释--
为结束它是选项,以及--
被视为文件名或字符串或其他非选项参数之后的所有内容(例如,防止以选项开头的文件名-
被视为选项)。
./my-wrapper -a -b -c -- -d -e -f -- non-option args here
顺便说一句,--
至少从 20 世纪 70 年代末或 80 年代初开始,它就被用来标志着期权的结束。