TCL简介 - 图文 下载本文

这个命令同时具有重命名和移动文件(夹)的功能。把source指定的文件或目录改名或移动到targetDir下。 只有当存在-force选项时,已经存在的文件才会被覆盖。 试图覆盖一个非空的目录或以一个文件覆盖一个目录或以一个目录覆盖一个文件都会导致错误。

file rootname name 返回name中最后“.”以前(不包括这个小数点)的所有字符。如果name中没有“.”返回Name。 file size name 返回十进制字符串,以字节表示name的大小。如果文件不存在或得不到name的大小,返回错误。 file stat name arrayName 调用stat内核来访问name,并设置arrayName参数来保存stat的返回信息。 arrayName被当作一个数组,它将有以下元素:atime、ctime、dev、gid、ino、mode、mtime、nlink、size、type和uid。除了type以外,其他元素都是十进制的字符串,type元素和file type命令的返回值一样。其它各个元素的含义如下: atime 最后访问时间. ctime 状态最后改变时间. dev 包含文件的设备标识. gid 文件组标识. ino 设备中文件的序列号. mode 文件的mode比特位. mtime 最后修改时间. nlink 到文件的连接的数目. size 按字节表示的文件尺寸. uid 文件所有者的标识.

这里的atime、mtime、size元素与前面讨论的file的选项有相同的值。要了解其他元素更多的信息,就查阅stat系统调用的文件;每个元都直接从相应stat返回的结构域中得到。 文件操作的stat选项提供了简单的方法使一次能获得一个文件的多条信息。这要比分多次调用file来获得相同的信息量要显著的快。

file tail name 返回name中最后一个斜线后的所有字符,如果没有斜线返回name。

file type name 返回文件类型的字符串,返回值可能是下列中的一个: file、directory、characterspecial、blockSpecial、fifo、link或socket。 file writable name

如果当前用户对name可进行写操作,返回1,否则返回0。

错误和异常 > 错误

错误和异常处理机制是创建大而健壮的应用程序的必备条件之一,很多计算机语言都提供了错误和异常处理机制,TCL也不例外。 错误(Errors)可以看作是异常(Exceptions)的特例。TCL中,异常是导致脚本被终止的事件,除了错误还包括break、continue 和return等命令。TCL允许程序俘获异常,这样仅有程序的一部分工作被撤销。程序脚本俘获异常事件以后,可以忽略它,或者从异常中恢复。如果脚本无法恢复此异常,可以把它重新发布出去。下面是与异常有关的TCL命令:

catch command ?varName? 这个命令把command作为TCL脚本求值,返回一个整型值表明command结束的状态。如果提供varName参数,TCL将生成变量varName,用于保存command产生的错误消息。

error message ?info? ?code? 这个命令产生一个错误,并把message作为错误信息。如果提供info参数,则被用于初始化全局变量errorInfo。如果提供code参数,将被存储到全局变量errorCode中。

return -code code ?-errorinfo info? ?-errorcode errorCode? ?string? 这个命令使特定过程返回一个异常。code指明异常的类型,必须是ok,error,return,break,continue或者是一个整数。-errorinfo选项用于指定全局变量errorInfo 的初始值,-errorcode用于指定全局变量errorCode的初始值。 string给出return的返回值或者是相关的错误信息,其默认值为空。 错误

当发生一个TCL错误时,当前命令被终止。如果这个命令是一大段脚本的一部分,那么整个脚本被终止。如果一个TCL过程在运行中发生错误,那么过程被终止,同时调用它的过程,以至整个调用栈上的活动过程都被终止,并返回一个错误标识和一段错误描述信息。

举个例子,考虑下面脚本,它希望计算出列表元素的总和: set list {44 16 123 98 57} set sum 0 foreach el $list {

set sum [expr $sum+$element] }

=> can't read \

这个脚本是错误的,因为没有element这个变量。TCL分析expr命令时,会试图用element变量的值进行替换,但是找不到名字为element的变量,所以会报告一个错误。由于foreach命令利用TCL解释器解释循环体,所以错误标识被返回给foreach。foreach收到这个错误,会终止循环的执行,然后把同样的错误标识作为它自己的返回值返回给调用者。按这样的顺序,将致使整个脚本终止。错误信息can't read \会被一路返回,并且很可能被显示给用户。

很多情况下,错误信息提供了足够的信息为你指出哪里以及为什么发生了错误。然而,如果错误发生在一组深层嵌套的过程调用中,仅仅给出错误信息还不能为指出哪里发生了错误提供足够信息。为了帮助我们指出错误的位置,当TCL撤销程序中运行的命令时,创建了一个跟踪栈,并且把这个跟踪栈存储到全局变量errorInfo中。跟踪栈中描述了每一层嵌套调用。例如发生上面的那个错误后,errorInfo有如下的值:

can't read \ while executing \

(\ invoked from within \

set sum [expr $sum+$element] }\

在全局变量errorCode中,TCL还提供了一点额外的信息。errorCode变量是包含了一个或若干元素的列表。第一个元素标示了错误类别,其他元素提供更详细的相关的信息。不过,errorCode变量是TCL中相对较新的变量,只有一部分处理文件访问和子过程的命令会设置这个变量。如果一个命令产生的错误没有设置errorCode变量,TCL会填一个NONE值。

当用户希望得到某一个错误的详细的信息,除了 命令返回值中的错误信息外,可以查看全局变量errorInfo和errorCode的值。 错误和异常 > 从TCL脚本中产生错误

大多数TCL错误是由实现TCL解释器的C代码和内建命令的C代码产生的。然而,通过执行TCL命令error产生错误也是可以的,见下面的例子: if {($x<0)||($x>100)} { error \ }

error命令产生了一个错误,并把它的参数作为错误消息。

作为一种编程的风格,你应该只在迫不得已终止程序时下才使用error命令。如果你认为错误很容易被恢复而不必终止整个脚本,那么使用通常的return机制声明成功或失败会更好(例如,命令成功返回某个值,失败返回另一个值,或者设置变量来表明成功或失败)。尽管从错误中恢复是可能的,但恢复机制比通常的return返回值机制要复杂。因此,最好是在你不想恢复的情况下才使用error命令。

错误和异常 > 使用catch捕获错误

错误通常导致所有活动的TCL命令被终止,但是有些情况下,在错误发生后继续执行脚本是有用的。例如,你用unset取消变量x的定义,但执行unset时,x可能不存在。如果你用unset取消不存在的变量,会产生一个错误: % unset x

can't unset \ 此时,你可以用catch命令忽略这个错误: % catch {unset x} 1

catch的参数是TCL脚本。如果脚本正常完成,catch返回0。如果脚本中发生错误,catch会俘获错误(这样保证catch本身不被终止掉)然后返回1表示发生了错误。上面的例子忽略unset的任何错误,这样如果x存在则被取消,即使x以前不存在也对脚本没有任何影响。

catch命令可以有第二个参数。如果提供这个参数,它应该是一个变量名,catch把脚本的返回值或者是出错信息存入这个变量。

êtch {unset x} msg 1

%set msg

can't unset \

在这种情况下,unset命令产生错误,所以msg被设置成包含了出错信息。如果变量x存在,那么unset会成功返回,这样catch的返回值为0,msg存放unset命令的返回值,这里是个空串。如果在命令正常返回时,你想访问脚本的返回值,这种形式很有用;如果你想在出错时利用错误信息做些什么,如产生log文件,这种形式也很有用。 错误和异常 > 其它异常

错误不是导致运行中程序被终止的唯一形式。错误仅是被称为异常的一组事件的一个特例。除了error,TCL中还有三种形式的异常,他们是由break、continue和return命令产生的。所有的异常以相同的方式导致正在执行的活动脚本被终止,但有两点不同:首先,errorInfo和errorCode只在错误异常中被设置;其次,除了错误之外的异常几乎总是被一个命令俘获,不会波及其他,而错误通常撤销整个程序中所有工作。例如,break和continue通常是被引入到一个如foreach的循环命令中;foreach将俘获break和continue异常,然后终止循环或者跳到下一次重复。类似地,return通常只被包含在过程或者被source引入的文件中。过程实现和source命令将俘获return异常。 所有的异常伴随一个字符串值。在错误情况,这个串是错误信息,在return方式,串是过程或脚本的返回值,在break和continue方式,串是空的。 catch命令其实可以俘获所有的异常,不仅是错误。catch命令的返回值表明是那种情况的异常,catch命令的第二个参数用来保存与异常相关的串。例如: êtch {return \ 2 %set string all done 下表是对命令: catch command ?varName? 的说明。 catch返回值 0 1 2 3 4 其他值 描述 正常返回,varName给出返回值 错误。 varName给出错误信息 或者返回给source的结果 执行了break命令,varName为空 执行了continue命令,varName为空 用户或应用自定义 catch,for,foreach,while,过程 catch,for,foreach,while,过程 catch 无异常 catch 俘获者 执行了return命令,varName 包含过程返回值catch,source,过程调用 与catch命令提供俘获所有异常的机制相对应,return可以提供产生所有类型异常。 这里有一个do命令的实现,使用了catch和return来正确处理异常: