Provided by: manpages-zh_1.5.1-2_all bug

NAME

       trace - 监视变量访问

 SYNOPSIS
       trace option ?arg arg ...?
_________________________________________________________________

 DESCRIPTION
       这个命令导致在调用了特定操作的时候执行                              Tcl
       命令。现在只实现了变量跟踪。合法的 option (选项) (可以是缩写)有:

       trace variable name ops command
              安排      command       在变量       name       被以用       ops
              给出的方式访问的时候执行。Name
              可以引用一个普通变量、数组的一个元素,或整个的一个数组(就是说,name
              可以只是一个数组的名字,而不加在圆括号中的索引)。如果       name
              引用整个的一个数组,则在操纵了这个数组的任何元素的时候调用
              command         。如果这个变量不存在,则建立它但不给它值,所以对
              namespace     which 查询是可见的,但对 info exists     不是。

              Ops     指示要进行何种操作,它由下列字母中的一个或多个组成:

              r      在读这个变量的时候调用 commandw      在写这个变量的时候调用 commandu      在删除这个变量的时候调用     command。可以使用      unset
                     命令显式的删除变量,或者在过程返回的时候隐式的删除(所有它们的局部变量)。在删除解释器的时候也删除变量,因为没有在其中执行命令的解释器所以不调用跟踪。

              当触发跟踪的时候,向                                     command
              添加三个参数,所以实际上的命令如下:
                     command name1 name2 op
              Name1name2         给出被访问了的变量的名字:
              如果这个变量是个标量,则    name1     给出变量的名字而     name2
              是一个空串;如果变量是一个数组元素,则                     name1
              给出数组的名字而                                           name2
              给出在这个数组中的索引;如果整个数组被删除并且跟踪注册在整个数组上,而不是在一个单一元素上,则
              name1 给出这个数组的名字而 name2 是一个空串。Name1name2
              不是必须与在   trace  variable      命令中使用的名字相同:  upvar
              命令允许一个过程在不同的名字下引用一个变量。Op
              指示在这个变量上进行了何种操作,它是上面定义的   rw、或      u
              中的一个。

              Command              在与调用跟踪操作的代码的相同的上下文中执行:
              如果被访问的变量是一个      Tcl     过程的一部分,则     command
              将访问到与过程中的代码相同的局部变量。这个上下文可能与在其中建立跟踪的上下文不同。如果
              command                                        调用一个过程(它-
              常这么做),则过程要想访问被跟踪的变量必须使用        upvaruplevel。还要注意                                          name1
              不是必须与用来在变量上设置跟踪的那个名字相同;如果通过用
              upvar     定义的一个变量进行访问,则可能发生不同。

              对于读和写跟踪,command
              可以修改变量来影响被跟踪的操作的结果。如果command
              在读写跟踪期间修改了一个变量的值,则这个新值将被返回为跟踪操作的结果。除非从
              command
              返回的值是一个某种错误,此时跟踪的操作返回的错误与跟踪命令返回的错误消息相同,否则忽略它(例如,可使用这种机制实现只读变量)。对于写跟踪,在这个变量的值被改变之后调用
              command
              ;它把一个新值写到这个变量中来屏弃在这次写操作中指定的-
              始值。要实现只读变量,command     必须存储这个变量的旧值。

              当                                                       command
              在一个读或写跟踪期间执行的时候,在变量上的跟踪被暂时禁用。这意味着
              command       调用的读和写将直接发生,不用再次调用       command
              (或任何其他跟踪)。但是,如果                             command
              删除了这个变量则调用删除跟踪。

              在调用一个删除跟踪的时候,这个变量已颈簧境:
              它将出现为未定义的而不加以跟踪。如果因为一个过程返回而发生一个删除,则在返回到的那个过程的变量上下文中调用跟踪:
              返回的过程的栈桢已-
              不存在了。在删除跟踪期间不禁止跟踪,所以如果一个删除跟踪命令建立了一个新的跟踪并访问了这个变量,则调用这个跟踪。忽略删除跟踪的任何错误。

              如果在一个变量上有多个跟踪,则以建立的次序调用它们,先处理最新的。如果一个跟踪返回一个错误,则不对这个变量调用进一步的跟踪。如果一个数组元素有一个跟踪设置,并且还有一个在整个数组上的跟踪设置,调用在整个数组上的跟踪先于在这个元素上的跟踪。

              一旦建立了,跟踪保持有效直到用下面描述的      trace      vdelete
              命令删除这个跟踪、直到删除了这个变量,或直到删除了这个解释器为止。删除数组的一个元素将删除在这个元素上的任何跟踪,但不删除在整个数组上的跟踪。

              这个命令返回一个空串。

       trace vdelete name ops command
              如果在变量  name  上设置了一个用  ops      给出操作和用  command
              给出命令的跟踪,则删除这个跟踪,这样将永不再次调用       command
              。返回一个空串。

       trace vinfo name
              返回一个列表,为每个在变量                                  name
              设置的当前跟踪包含一个元素。这个列表的每个元素自身是一个包含两个元素的列表,它们是与这个跟踪相关的
              opscommand          。如果          name
              不存在或没有跟踪设置,则命令的结果是一个空串。

 KEYWORDS
       read, variable, write, trace, unset

[[2001/11/21

 Linux man:
       http://cmpp.linuxforum.net