Почему :: cmdline :: getoptions выдает ошибку? - PullRequest
0 голосов
/ 09 января 2019

Почему следующий код:

#!/usr/bin/env tclsh
package require cmdline;
set options {{d.arg "" "destination directory"}}
set usage ": $::argv0 \[options] filename ...\noptions:"
set params [::cmdline::getoptions ::argv $options $usage]

выдает следующую ошибку при выполнении ./main.tcl -help?

main : ./main.tcl [options] filename ...
options:
 -d value             destination directory <>
 -help                Print this message
 -?                   Print this message

    while executing
"error [usage $optlist $usage]"
    (procedure "::cmdline::getoptions" line 15)
    invoked from within
"::cmdline::getoptions ::argv $options $usage"
    invoked from within
"set params [::cmdline::getoptions ::argv $options $usage]"
    (file "./main.tcl" line 8)

Он должен отображать информацию об использовании, но я не ожидал ошибки впоследствии. Я сделал что-то не так?

1 Ответ

0 голосов
/ 09 января 2019

Из того, что я понимаю из документов (выделение мое):

Опции -? , -help и - понятны неявно. Обработка первых двух параметров отмены путем выдачи ошибки и принудительной генерации сообщения об использовании , тогда как обработка последнего параметра прерывания обрабатывается без ошибки, оставляя все аргументы после обычной обработки , даже если начинаются с тире.

с помощью -help или -? будет всегда выдавать ошибку.

Далее в документах вы можете увидеть пример, где try { ... } trap { ... } используется в сочетании с ::cmdline::getoptions, что может быть тем, как вы хотите это сделать:

try {
    array set params [::cmdline::getoptions ::argv $options $usage]
} trap {CMDLINE USAGE} {msg o} {
    # Trap the usage signal, print the message, and exit the application.
    # Note: Other errors are not caught and passed through to higher levels!
    puts $msg
    exit 1
}
...