Ваша процедура не оценивает содержимое этой переменной. Он просто читает его (возможно, несколько раз) и печатает его не более одного раза. Вы можете, конечно, установить переменную на результат оценки скрипта, но оценка должна быть выполнена до того, как эта процедура будет сканирована, по крайней мере, если вы не сделаете что-нибудь «умное» со следами чтения. Но не делай этого; это было бы очень запутанным и очень хрупким на практике! (Это настолько ужасная идея, что я не собираюсь предоставлять пример кода для него. На самом деле не используйте для этого трассировки, так как вы создадите код, который вы никогда не сможете отлаживать.)
In В общем, Tcl старается не оценивать код, за исключением случаев, когда ему прямо сказано сделать это, поскольку неожиданная оценка может стать дырой в безопасности самого высокого порядка и источником огромного количества ошибок и других fl aws.
Если вы хотите изменить процедуру, вот что она должна стать:
proc command1 {} {
global var_command1
set result [uplevel 1 $var_command1]
if {$result eq ""} {
puts "nothing..."
} else {
puts $result
}
}
Изменение заключается в том, что она использует uplevel 1
для оценки сценария в области действия вызывающей стороны (uplevel #0
всегда использование глобальной области видимости также было бы жизнеспособным, учитывая, что сценарий не передается в качестве аргумента). Кроме того, оператор eq
предпочтителен для сравнения строк над ==
; в этом случае это не имеет большого значения, поскольку сравнение выполняется с нечисловым числом, но использование правильного оператора генерирует немного лучший байт-код.