Сценарий, как вы написали, работает нормально; он присваивает строку 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