trace variable name ops command
r
command name1 name2 op
Команда command исполняется в том же контексте,
что и код, вызвавший срабатывание trace. То есть если действие с переменной
выполнялось в процедуре, то команда command может обращаться к локальным
переменным этой процедуры. Этот контекст может отличаться от контекста, в
котором выполнялась сама команда trace. Если команда conmmand
есть вызов процедуры (как обычно и бывает), то в процедуре необходимо использовать
команду upvar или uplevel
чтобы получить доступ к контролируемой переменной. Как уже говорилось, имена
в переменных name1 и name2не обязано совпадать с теми, что были
заданы в команде trace variable, поскольку
команда upvar позволяет процедуре обращаться к
переменной по различным именам.
Если команда trace контролирует чтение и запись в переменную, команда command может изменить результат отслеживаемой операции. Если команда command изменяет значение отслеживаемой переменной, то новое значение будет возвращено как результат отслеживаемой операции. Величина, возвращаемая командой command, игнорируется, если только это не ошибка. Тогда отслеживаемая операция также возвращает ошибку с тем же самым сообщением об ошибке, которое было сформировано в команде command, не поясняя, что ошибка произошла в результате отслеживания переменной. Это может приводить к определенным трудностям в определении истиной операции, при выполнении которой возникла ошибка.
При отслеживании записи в переменную команда command вызывается после того, как значение переменной изменено. Поэтому с ее помощью можно изменить присвоенное значение. Если при этом возвращать исходное значение, переменная окажется доступной только для чтения.
При выполнении команды command при отслеживании чтения или записи в переменную механизм слежения временно отключается. То есть выполнение этих операций в command не приведет к новых вызовам command. Однако, если в command выполняется удаление переменной, это приводит к соответствующему вызову.
Когда срабатывает команда trace на удаление переменной, переменная уже удалена. Если удаление переменной произошло вследствие завершения процедуры, команда command вызывается в контексте вызывающей процедуры, поскольку контекст вызвавшейся процедуры уже не существует. Отслеживание не отключается при выполнении command в случае удаления переменной. Поэтому если в command выполняется новая команда trace и удаляется соответствующая переменная, выполнится и соответствующая команда command. Ошибки при отслеживании удаления игнорируются.
Если одна и та же переменная отслеживается с помощью нескольких команда trace, то выполняться все соответствующие команды command с учетом порядка выполнения соответствующих команд trace. Чем позднее она выполнялась, тем раньше будет выполнена соответствующая команда command. Если одна из команд command при этом возвратит ошибку, остальные команды выполняться не будут. Если одна команда используется для отслеживания элемента массива, а другая — для массива в целом, первой выполняется команда отслеживания массива в целом, а затем уже команда отслеживания элемента.
Однажды выполненная команда trace остается активной пока она не удалена с помощью описанной ниже команды trace vdelete, пока не удалена переменная или пока не удален интерпретатор. Удаление элемента массива приведет к прекращению отслеживания этого элемента, но не отслеживания массива в целом.
Команда trace variable возвращает пустую строку.
trace vdelete name ops command