【问题标题】:TCL: use "help" option from cmdline packageTCL:使用命令行包中的“帮助”选项
【发布时间】:2021-01-19 16:26:46
【问题描述】:

在我的 TCL 脚本中,我试图提供将使用“cmdline”包解析的输入参数。我在脚本中定义了以下内容:

set run_options {
{input_1.arg 8 "first input argument"}
{input_2.arg 1 "second input argument"}
{msb  "choose it if input data has msb first"}
{lsb  "choose it if input data has lsb first"}
}
set my_usage ": \n tclsh my_src \[options] ...\noptions are:"

if {[catch {array set params [::cmdline::getoptions argv $run_options $my_usage]} msg]} {
 puts "Error while parsing user options of $msg"
 exit 1

}

一切看起来都很好,除了在运行我的脚本时我发现'cmdline'包默认定义了“帮助”选项,但是当我使用“-help”选项运行我的脚本时,输出如下:

Error while parsing user options of my_src : 
 tclsh my_src [options] ...
options are:
 -input_1 value       first input argument <8>
 -input_2 value       second input argument <1>
 -msb                 choose it if input data has msb first
 -lsb                 choose it if input data has lsb first
 --                   Forcibly stop option processing
 -help                Print this message
 -?                   Print this message

那么,有谁知道如何使用这个自动添加的“帮助”选项而不给出错误消息?

【问题讨论】:

  • 不要打印出错误消息中的“Error while...”部分?
  • 对,就是puts $msg
  • 您可能错过了我在其他情况下使用“错误”的要点。例如:如果我提供了错误的选项,那么我应该得到这个“错误”。但“帮助”不应该是一个错误。
  • cmdline::getoptions 不区分 -help 和未知选项;他们都提出了同样的错误。 (如果您查看源代码,未知选项的处理方式与 -? 完全相同)

标签: tcl cmdline-args


【解决方案1】:

cmdline::getoptions 不区分-help 和未知选项(无法识别的选项被视为-?)。如果您想为这两种情况提供不同的消息,则需要直接在循环中使用较低级别的函数之一,或者类似于以下cmdline::getoptions 的增强版本:

#!/usr/bin/env tclsh
package require try ;# In case you're still using tcl 8.5 for some reason
package require cmdline 1.5

proc better_getoptions {arglistVar optlist usage} {
    upvar 1 $arglistVar argv
    # Warning: Internal cmdline function
    set opts [::cmdline::GetOptionDefaults $optlist result]
    while {[set err [::cmdline::getopt argv $opts opt arg]]} {
        if {$err < 0} {
            return -code error -errorcode {CMDLINE ERROR} $arg
        }
        set result($opt) $arg
    }
    if {[info exists result(?)] || [info exists result(help)]} {
        return -code error -errorcode {CMDLINE USAGE} \
            [::cmdline::usage $optlist $usage]
    }
    return [array get result]
}

set run_options {
    {input_1.arg 8 "first input argument"}
    {input_2.arg 1 "second input argument"}
    {msb  "choose it if input data has msb first"}
    {lsb  "choose it if input data has lsb first"}
}
set my_usage ": \n tclsh my_src \[options] ...\noptions are:"

try {
    array set params [better_getoptions argv $run_options $my_usage]
    puts "All options valid"
} trap {CMDLINE USAGE} {msg} {
    puts stderr $msg
    exit 0
} trap {CMDLINE ERROR} {msg} {
    puts stderr "Error: $msg"
    exit 1
}

示例用法:

$ ./example.tcl --help
cmd : 
 tclsh my_src [options] ...
options are:
 -input_1 value       first input argument <8>
 -input_2 value       second input argument <1>
 -msb                 choose it if input data has msb first
 -lsb                 choose it if input data has lsb first
 --                   Forcibly stop option processing
 -help                Print this message
 -?                   Print this message
$ ./example.tcl -foo
Error: Illegal option "-foo"
$ ./example.tcl -input_1
Error: Option "input_1" requires an argument
$ ./example.tcl -msb
All options valid

【讨论】:

    猜你喜欢
    • 2012-02-01
    • 2013-07-26
    • 2015-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-26
    • 1970-01-01
    相关资源
    最近更新 更多