【发布时间】:2021-05-27 09:30:00
【问题描述】:
在执行 Tcl 脚本期间有什么方法可以检测环境变量的变化(我使用 Tk,所以执行时间可能很长)? 例如,如果我定义了一个环境变量 MYVAR=1,那么我可以通过编写 $ENV(MYVAR) 从 Tcl 访问它。现在假设在执行 Tcl 程序期间,我将 MYVAR 切换为 2。有没有办法,或者可能是一个命令,再次扫描每个环境变量,以便在我调用 $ENV(MYVAR) 时得到 2?
【问题讨论】:
在执行 Tcl 脚本期间有什么方法可以检测环境变量的变化(我使用 Tk,所以执行时间可能很长)? 例如,如果我定义了一个环境变量 MYVAR=1,那么我可以通过编写 $ENV(MYVAR) 从 Tcl 访问它。现在假设在执行 Tcl 程序期间,我将 MYVAR 切换为 2。有没有办法,或者可能是一个命令,再次扫描每个环境变量,以便在我调用 $ENV(MYVAR) 时得到 2?
【问题讨论】:
首先,其他进程不会看到任何进程的环境变量的变化。孩子们在创建时会获得当前环境的副本,仅此而已。
其次,要查看环境变量的变化,请将trace 放在::env 变量上(但不建议跟踪单个变量)。我不记得这在线程之间是否可靠地工作,但在一个线程中,如果你没有 C 代码修改你背后的变量,那就很好了。
proc detectChange {name1 name2 op} {
# We know what name1 and op are in this case; I'll ignore them
if {$name2 eq "MYVAR"} {
puts "MYVAR changed to $::env(MYVAR)"
}
}
trace add variable ::env write detectChange
请注意,Tk 在内部大量使用了跟踪(但它们使用的是 C API,而不是它们的 Tcl 语言 API)。
【讨论】: