Tcl中的cd命令不更新环境变量PWD的修正

风行水上 @ 2011-11-24 10:24:12
标签:

    先看下面的例子代码

    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
    
    标签:

      分享到:
      comments powered by Disqus

      27/31ms