неверное имя команды 2001:172:16:21::36

Мне нужно присвоить моей последней переменной следующую строку UDP6:[2001:172:16:21::36]

  set ipAddr1 "UDP6,2001:172:16:21::36"
  set ipAddrArr [split $ipAddr1 ","]
  set ipAddrArr11 [lindex $ipAddrArr 0]
  set ipAddrArr12 [lindex $ipAddrArr 1]
  set tmp ":\["
  set ipAddr1Part [join "$ipAddrArr11 $ipAddrArr12" $tmp]
  set tmp1 "]"
  set ipAddrFinal [join "$ipAddr1Part$tmp1"]

Когда я запускаю сценарий tcl, он дает недопустимое имя команды как 2001:172:16:21::36. Я напечатал значение ipAddrFinal, оно дает ожидаемое UDP6:[2001:172:16:21::36]

Пожалуйста, помогите мне? что мне не хватает


tcl
person Ram Narayan    schedule 12.06.2018    source источник
comment
Что вы нам не показываете? Как создать минимальный, полный и проверяемый пример   -  person glenn jackman    schedule 12.06.2018
comment
Показанный фрагмент кода в порядке. Скорее всего, вы используете $ipAddrFinal в другом контексте, где оцениваются скобки. Проверьте вывод ошибки, чтобы определить, какая строка вызывает проблему.   -  person Brad Lanam    schedule 12.06.2018


Ответы (1)


Сценарий, как вы написали, работает нормально; он присваивает строку UDP6:[2001:172:16:21::36] переменной ipAddrFinal. Однако, поскольку она содержит символы, которые в некоторых контекстах являются метасимволами Tcl, я подозреваю, что вы тогда используете строку небезопасным образом, скорее всего, с eval или, возможно, с subst или uplevel. Если вы посмотрите на трассировку стека ошибки (по умолчанию в глобальной переменной errorInfo), вам должно быть точно сказано, где находится ошибочный код; это может указать несколько мест, которые вам нужно искать, но обычно не так уж сложно найти источник проблемы.

Если ваша проблема связана с uplevel, вам, вероятно, потребуется использовать list для создания команды; 99,99% всех проблем с uplevel решаются таким образом. Если ваши проблемы исходят от eval, велика вероятность, что вам нужно переключиться на использование синтаксиса расширения. Если ваши проблемы возникли из-за subst или по каким-то другим причинам вы все еще глубоко запутались, свяжитесь с нами (со своей трассировкой стека, если вы не уверены, откуда возникла проблема).


Пример исправления для eval:

Изменять:

set action "puts \"IP\\ address\\ is\\ $ipAddrFinal\""
eval $action

to:

set action [list puts "IP address is $ipAddrFinal"]
{*}$action

NB: ошибка от выполнения eval также является разумным примером:

invalid command name "2001:172:16:21::36"
    while executing
"2001:172:16:21::36"
    ("eval" body line 1)
    invoked from within
"eval $action"

Обратите внимание, что он говорит, что он находится в eval, и это прямо указывает на небезопасную конструкцию скрипта. Команда list выполняет безопасное построение скриптов, что является одной из ее дополнительных сверхспособностей.

person Donal Fellows    schedule 12.06.2018
comment
Спасибо, я обнаружил, что он выдает ошибку, когда оценивает вспомогательную часть. Так что, возможно, он принимает эти квадратные скобки как команду. Как с этим справиться. Ниже приведена моя часть кода. .0 - person Ram Narayan; 13.06.2018
comment
set errorStatus [eval catch \{exec [subst $commandList] \} AbilityResult]. Это часть кода, в которой обрабатывается статус ошибки. - person Ram Narayan; 13.06.2018