1

Tcl 内でコマンド ライン引数を解析しています。引数は、パラメーターリストで宣言された方法と比較して、順不同で問題ありませんでした (実際に期待を呼び出していますが、この時点までは Tcl のみです)。

# cmdline package to handle arguments
package require cmdline

# set parameters
set parameters {
    {apk.arg                "" "apk file"}
    {apkdirfrom.arg         "" "apk from dir"}
    {apkdirto.arg           "" "apk to dir"}
    {pkg.arg                "" "package"}
    {mainclass.arg          "" "main class"}
    {monkey.arg             "" "monkeyrunner script"}
    {remotehost.arg         "" "remote host"}
    {remoteuser.arg         "" "remote user"}
    {logdir.arg             "" "log dir"}
    {timeout.arg            "" "timeout"}
    {disable-uninstall.arg  "" "unimplemented: disable uninstall. 0 disable is off, 1 disable is on."}
}

array set arg [cmdline::getoptions argv $parameters]

しかし、この注文はうまくいきませんでした。ここに示されているものとは少し異なる順序でそれらを呼び出した可能性があると思います。実際、Mac の Tcl と Windows の Cygwin Tcl を使用すると、その仮定は正しいようです。しかし、Ubuntu 12.04 Linux を使用すると、この仮定は正しくないことが判明しました。それらは特定の順序である必要がありました。

これはうまくいった順序です:

# パラメータを設定

set parameters {
    {apk.arg                "" "apk file"}
    {apkdirfrom.arg         "" "apk from dir"}
    {apkdirto.arg           "" "apk to dir"}
    {pkg.arg                "" "package"}
    {mainclass.arg          "" "main class"}
    {monkey.arg             "" "monkeyrunner script"}
    {remotehost.arg         "" "remote host"}
    {remoteuser.arg         "" "remote user"}
    {timeout.arg            "" "timeout"}
    {disable-uninstall.arg  "" "unimplemented"}
    {logdir.arg             "" "log dir"}
}

array set arg [cmdline::getKnownOptions argv $parameters]

つまり、ログディレクトリは、最後に来ると問題ないようです。

順序が重要であると思われるかどうか知っていますか? ないと思っていたのですが、どうやらあるようです。

とにかく、Mac では tcllib 1.12 を使用し、Ubuntu 12.04 では tcllib 1.14 を使用していることがわかりました。コマンドライン ライブラリを交換しようとしましたが、うまくいきませんでした。Macからcmdlineをコピーしたため、Windowsでは機能すると思いますが、それは機能します。

誰かがこの問題に少し光を当てることができれば、それは役に立ちます。

もう少し確実なもの (代替のコマンド ライン パーサー) をお勧めできれば、それは素晴らしいことです。

4

1 に答える 1

0

の代わりにcmdlinedictオプション処理に使用できます (すべての引数は値を持つオプションであるため)。

次のようなデフォルト値でオプション リストを設定します。

set options [dict create \
    -apk                "" \
    -apkdirfrom         "" \
    -apkdirto           "" \
    -pkg                "" \
    -mainclass          "" \
    -monkey             "" \
    -remotehost         "" \
    -remoteuser         "" \
    -logdir             "" \
    -timeout            "" \
    -disable-uninstall  "" \
]

そして、次のような使用法ドキュメントの辞書:

set optionsUsage [dict create \
    -apk                "apk file" \
    -apkdirfrom         "apk from dir" \
    -apkdirto           "apk to dir" \
    -pkg                "package" \
    -mainclass          "main class" \
    -monkey             "monkeyrunner script" \
    -remotehost         "remote host" \
    -remoteuser         "remote user" \
    -logdir             "log dir" \
    -timeout            "timeout" \
    -disable-uninstall  "unimplemented: disable uninstall. 0 disable is off, 1 disable is on." \
]

次のコマンドで使用法メッセージを出力できます。

proc printUsage optionsUsage {
    set maxlen 0
    dict for {opt -} $optionsUsage {
        set len [string length $opt]
        if {$len > $maxlen} { set maxlen $len }
    }
    dict for {opt use} $optionsUsage {
        puts [format "%-${maxlen}s %s" $opt $use]
    }
}

コマンドでは、実際のオプション値を次のように設定します。

set actualOptions [dict merge $::options $args]

(まぁ、本通りに行きたいのなら、このようにします:)

set actualOptions [dict merge $::options [dict create {*}$args]]

次のようにオプション ディクショナリをクエリします。

dict get $actualOptions -monkey

そして、次のようなオプションの特定の使用法を取得します。

dict get $::optionsUsage -monkey
于 2014-01-18T22:07:05.690 に答える