trace(3tcl)

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   在讀這個變數的時候呼叫 command。

    w   在寫這個變數的時候呼叫 command。

    u   在刪除這個變數的時候呼叫 command。可以使用 unset 命令顯式的刪除變數，或者在過程返回的時候隱式的刪除(所有它們的區域性變數)。在刪除直譯器的時候也刪除變數，因為沒有在其中執行命令的直譯器所以不呼叫跟蹤。

    當觸發跟蹤的時候，向 command 新增三個引數，所以實際上的命令如下: command name1 name2 op Name1 和 name2 給出被訪問了的變數的名字: 如果這個變數是個標量，則 name1 給出變數的名字而 name2 是一個空串；如果變數是一個數組元素，則 name1 給出陣列的名字而 name2 給出在這個陣列中的索引；如果整個陣列被刪除並且跟蹤註冊在整個陣列上，而不是在一個單一元素上，則 name1 給出這個陣列的名字而 name2 是一個空串。Name1 和 name2 不是必須與在 trace variable 命令中使用的名字相同: upvar 命令允許一個過程在不同的名字下引用一個變數。Op 指示在這個變數上進行了何種操作，它是上面定義的 r、w、或 u 中的一個。

    Command 在與呼叫跟蹤操作的程式碼的相同的上下文中執行: 如果被訪問的變數是一個 Tcl 過程的一部分，則 command 將訪問到與過程中的程式碼相同的區域性變數。這個上下文可能與在其中建立跟蹤的上下文不同。如果 command 呼叫一個過程(它經常這麼做)，則過程要想訪問被跟蹤的變數必須使用 upvar 或 uplevel。還要注意 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 設定的當前跟蹤包含一個元素。這個列表的每個元素自身是一個包含兩個元素的列表，它們是與這個跟蹤相關的 ops 和 command 。如果 name 不存在或沒有跟蹤設定，則命令的結果是一個空串。

關鍵字 KEYWORDS
read, variable, write, trace, unset

[中文版維護人]
寒蟬退士

[中文版最新更新]
2001/11/21

《中國 Linux 論壇 man 手冊頁翻譯計劃》:
http://cmpp.linuxforum.net

跋
本頁面中文版由中文 man 手冊頁計劃提供。
中文 man 手冊頁計劃：https://github.com/man-pages-zh/manpages-zh