1.1 :文件存取
1. 文件打开命令:
格式:openfile fileName ? access ? permission
解释:
Ø fileName:文件名称
Ø access:存取模式
序号 | 存取模式 | 描述 |
1 | r | 打开文件读。文件必须已经存在 |
2 | r+ | 打开文件读写。文件必须已经存在 |
3 | w | 打开文件写。如果文件不存在创建一个,长度设为零 |
4 | w+ | 打开文件读写。如果文件不存在创建一个,长度设为零 |
5 | a | 打开文件写。文件必须已经存在,位置指到文件末尾 |
6 | a+ | 打开文件读写,如果文件不存在,创建一个,位置指到文件末尾 |
Ø permission:权限,举一个例子:
1.2 :文件信息
1.File命令提供文件信息
序号 | 函数 | 描述 |
1 | file dirname | 返回路径名 |
2 | file extension | 返回文件扩展名 |
3 | file rootname | 返回不包括扩展名的文件名 |
4 | file tail | 返回不包括路径名的文件名 |
5 | file atime | 返回最后一次文件存取时间 |
6 | file executable | 如果可执行返回1 |
7 | file exists | 如果文件存在返回1 |
8 | file isdirectory | 如果是个路径返回1 |
9 | file isfile | 如果是个文件返回1 |
10 | file lstat | 返回一个文件状态信息数组 atime:最后一次存取时间 ctime:最后文件状态改变时间 dev:设备节点 gid:文件的组id ino:节点数 mode:节点保护模式 mtime:最后数据修改时间 nlink:硬链接数 size:文件字节数 type:文件类型 uid:文件用户id
注意:这个函数和file stat不同在于当为一个符号链接时,file lstat是得到链接的信息,而file stat是得到链接的文件的信息 |
11 | file mtime | 返回文件最后修改时间 |
12 | file owned | 如果用户是该文件所有者返回1 |
13 | file readable | 如果文件可读返回1 |
14 | file readlink | 返回符号链接的文件名 |
15 | file size | 返回文件大小(byte为单位) |
16 | file stat | 返回一个文件状态信息数组 |
17 | file type | 返回文件类型 file:普通文件 directory:目录 characterSpecial:字符导向设备 blockSpecial:块导向设备 fifo:命名管道 link:符号链接 socket:套接字 |
18 | file writable | 如果文件可写返回1 |
2.glob命令通过匹配模式返回一个文件名列表
格式:glob ?switches? pattern? patternN?
Ø switches:
-nocomplain:允许返回一个空列表的时候不生成错误,如果没有这个开关,返回空列表的时候会生成错误
--:允许在匹配式中使用横杠
Ø pattern:匹配式
l {a,b,....}:匹配所有的a,b,等字符串
l 文件名以小数点开头则解析为小数点,其他地方就解析为通配符;
l 所有的 / 都必须准确匹配;
l 如果匹配式开始是:~/ ,则 ~ 解析为环境变量HOME;
1.3 如果匹配式的:TCL中的子进程调用-open & exec
1. 格式:open |progName ?access?
功能:为管道返回一个文件描述符。如果progName用引号括起来,可以包含参数。
2. 格式:exec ?switches?arg1?arg2?....?argN?
功能:执行子进程
Ø switches:-keepnewline:管道输出的每行后面加个新行。
-- :标志开关结束,哪怕后面跟着有 – 开头的字符串,都作为参数处理。
Ø argN:参数可以是:可执行程序;作为子进程运行的命令行;输出重定向
输出重定向包含有:
序号 | 重定向 | 描述 |
1 | | | 将标准输出重定向到标准输入中 |
2 | <fileName | 管道中的第一个程序将读入文件内容 |
3 | <@fileID | 管道中的第一个程序将读入文件描述符中的内容,该文件描述符是使用 open...”r” 的返回 |
4 | <<value | 管道中第一个程序读到这个值 |
5 | >fileName | 管道中最后一个程序的输出内容覆盖写入文件 |
6 | >>fileName | 管道中最后一个程序的输出内容写入文件,添加到文件末尾 |
7 | 2>fileName | 管道中所有程序的标准错误输出到文件,覆盖文件原有内容 |
8 | 2>>fileName | 管道中所有程序的标准错误输出到文件,添加到文件末尾 |
9 | >@fileID | 管道中程序输出内容写到文件描述符,该文件描述符是使用open...”w” 打开 |
例子:027_file.txt
set io [open "|c:/windows/system32/notepad.exe c:/temp/inv_2700.tcl" r+] ;#open 调用外部程序
set invert [exec c:/windows/system32/notepad.exe c:/temp/001.txt] ;#exec 调用外部程序
因为管道的例子在windows下比较难举,现以unix下一段代码为例子,通过管道读出 ps(列出进程)命令的输出
tclfolder%tclsh
% set fid [open "|ps -ef" r+]
file5
% gets $fid line;puts "line: $line"
line: UID PID PPID C STIME TTY TIME CMD
% gets $fid line;puts "line: $line"
line: root 1 0 0 Nov 11 - 0:01 /etc/init
% gets $fid line;puts "line: $line"
line: root 86118 1 0 Nov 11 - 5:00 /usr/sbin/syncd 60
% gets $fid line;puts "line: $line"
line: tclll 90248 893094 0 11:54:55 pts/14 0:00 -csh
% gets $fid line;puts "line: $line"
line: root 110730 1 0 Nov 11 - 0:00 /usr/sbin/uprintfd
% gets $fid line;puts "line: $line"
line: root 118848 1 0 Nov 11 - 0:00 /usr/ccs/bin/shlap64
% exit
tclfolder%
1.4 :命令或者变量是否存在-info
1. info命令列表,使用的匹配式规则和string match一致,并且如果不使用匹配式,返回所有的项
序号 | 命令 | 描述 |
1 | info commands ?pattern? | 返回匹配的命令列表 |
2 | info exists varName | 变量存在返回一,否则返回零 |
3 | info globals ?pattern? | 返回全局变量列表 |
4 | info locals ?pattern? | 返回局部变量列表 |
5 | info procs ?pattern? | 返回过程列表 |
6 | info vars ?pattern? | 返回变量列表 |
例子:028_file.tcl
proc safeIncr {val {amt 1}} {
upvar $val v
if {[info exists v]} { incr v $amt} else { set v $amt }
}
if {[info procs safeIncr] == "safeIncr"} { ;#判断过程是否定义
safeIncr a ;#a 没有定义
}
puts "After calling SafeIncr with a non existent variable: $a" ;#返回1
set a 100
safeIncr a
puts "After calling SafeIncr with a variable with a value of 100: $a" ;#返回101
safeIncr b -3
puts "After calling safeIncr with a non existent variable by -3: $b" ;#返回-3
set b 100
safeIncr b -3
puts "After calling safeIncr with a variable whose value is 100 by -3: $b" ;#返回97
puts "\nThese variables have been defined: [lsort [info vars]]"
puts "\nThese globals have been defined: [lsort [info globals]]"
;# 检查本地过程是否存在
set exist [info procs localproc];
if {$exist == ""} {
puts "\nlocalproc does not exist at point 1"
}
proc localproc {} {
global argv;
set loc1 1;
set loc2 2;
puts "\nLocal variables accessible in this proc are: [lsort [info locals]]"
puts "\nVariables accessible from this proc are: [lsort [info vars]]"
puts "\nGlobal variables visible from this proc are: [lsort [info globals]]"
}
set exist [info procs localproc];
if {$exist != ""} {
puts "localproc does exist at point 2"
}
localproc;
1.5 :解释器状态-info
1. 关于当前解释器状态信息命令列表
序号 | 命令 | 描述 |
1 | info cmdcount | 返回解释器已经运行的命令的数量 |
2 | info level ?number? | 返回相应栈级别的过程的名字和参数 |
3 | info patchlevel | 返回全局变量解释器补丁版本和修订号tcl_patchlevel的值 |
4 | info tclversion | 返回全局变量解释器版本tcl_version |
5 | info script | 返回当前脚本的名字 |
6 | pid | 返回当前解释器进程id |
例子:029_file.tcl
puts "This is how many commands have been executed: [info cmdcount]"
puts "Now *THIS* many commands have been executed: [info cmdcount]"
puts "\nThis interpreter is revision level: [info tclversion]"
puts "This interpreter is at patch level: [info patchlevel]"
puts "\nThe temporary script this is executing is named: [info script]"
puts "The Pid for this program is [pid]"
proc factorial {val} {
puts "Current level: [info level] - val: $val"
set lvl [info level]
if {$lvl == $val} {return $val;}
return [expr ($val-$lvl) * [factorial $val]];
}
set count1 [info cmdcount]
set fact [factorial 3]
set count2 [info cmdcount]
puts "The factorial of 3 is $fact"
puts "Before calling the factorial proc, $count1 commands had been executed"
puts "After calling the factorial proc, $count2 commands had been executed"
puts "It took [expr $count2-$count1] commands to calculate this factorial"
1.6 :过程信息-info
1.关于过程信息的命令列表
序号 | 命令 | 描述 |
1 | info args procname | 返回一个过程的参数列表 |
2 | info body procname | 返回一个过程的内容 |
3 | info default procname arg varName | 如果一个过程的某个参数设置了缺省值则返回一,否则返回零 |
例子:030_procinfo.tcl
proc demo {argument1 {default "DefaultValue"} } {
puts "This is a demo proc. It is being called with $argument1 and $default"
}
puts "The args for demo are: [info args demo]\n"
puts "The body for demo is: [info body demo]\n"
set arglist [info args demo]
foreach arg $arglist {
if {[info default demo $arg defaultval]} { ;#defaultval 用于取回缺省值
puts "$arg has a default value of $defaultval"
} else {
puts "$arg has no default"
}
}