先看下面的例子代码
exec /usr/bin/env > tmp1.log file mkdir tmp cd tmp exec /usr/bin/env > tmp2.log cd ../tmp set env(PWD) [pwd] exec /usr/bin/env > tmp3.log
检查上面例子中命令env
的输出,发现"tmp2.log"中的PWD并没有改变,还是和cd之前一样。这说明Tcl的内置命令cd并不会更新当前环境变量中PWD的值。
这会带来一个问题,如果cd之后用exec执行了外部程序或者之后的程序借助环境变量PWD来确定当前工作目录的话,那么结果将是不正确的。
如何修正这个问题呢。借助trace
命令是一种比较简易的解决方法。不需要对已有代码作太多的修改。
proc cd_postfix {cmd-string code result op} { set ::env(PWD) [pwd] } trace add execution cd leave cd_postfix