脚本编程 Expect is an extension of the TCL language. This means that you can do
everything with expect that you can do with TCL.
1 TCL expressions
First of all you need to know a bit on how the TCL language works and how you
can write expressions.
1.1 evaluate and return
If you want to evaluate something and return the value then use the [
expression ] syntax. This is evaluated before everything else.
set a [ 2 + 1 ]This will evaluate 2 + 1 and returns the value 3 which then a is set to.
1.2 Quoting
There are two ways to quote strings. The fist way is to use
"string" and the second way is to use {string}. The first will evaluate
expressions and the later will not.
set a "This number "This will set a to "This number 0" assuming i is 0.
Example 2: set a {This number }This will set a to "This number "
1.3 Variable dereferencing
During expression evaluation a '$' followed by a name is interpreted as the
value that the variable with that name, before the rest is evaluated.
1.4 Lists
Lists are simply strings separated with whitespaces.
set list_of_two_elements "a b"set list2_of_two_elements {a b}In many situations it is necessary to be able to determine the difference
between the list containing "a" and "b" and the list containing the single
element "a b". This is done by proceeding double quotes with a backslash
before the double quote. Here is a (ugly) list of one element:
"/"a b/""A much nicer looking thing is to use braces:
{{a b}}This is very similar to other languages and makes it very easy to construct
arbitrarily complex lists:
{a b {c d} {e {f g {xyz}}} k}
1.5 Arrays
Tcl provide a second way to multiple strings together called arrays. This is
similar to hash lists in perl. Each string in an array is called an element
and has an associated name. The name is given in parentheses following the
array name.
set uid(0) "root"set uid(1) "daemon"It can then be referenced by $uid($number)
set number 1set a $uid[$number]It is also possible to have strings (even with whitespace) as the reference
name. You need to quote it to make it one argument to set though. This is not
specific to arrays.
set "uid(foo bar)" recogor
set uid({foo bar}) recogMultidimentional arrays can be simulated this way as any string can
be used, including the ',' caracter.
Arrays can be passed to procedures but not as easy as scalar variables. The
upvar command has to be used.
array size |
array size nameReturn the number of elements in the array with the name name. |
array names |
Return the names that refer to elements in the array with the name name. |
1.6 Continuation lines
By default commands do not continue after end of line. To allow this a
backslash must be presented at the end of the line.
Open braces continueacross lines automatically but note that this syntax is incorrect:
if { a }{ expression}The reason for this is that you must either add a backslash after the if
statement or move the '{' caracter to the same line.
Double quotes also continues at end of line but with the newline replaced
with a single whitespace. To really give a newline a backslash must be
presented.
set oneline "hello world"set twoline "hello/ world"Oneline will be set to "hello< space >world" and twoline will be set to
"hello< newline >< space >< space >world".
1.7 Unknown expressions
The unknown command or procedure is called when another command is executed
which is not known to the tcl interpreter. This gives you the opportunity
to recover in an intelligent way.
proc unknown {args} { expr $args}By default the unknown command tries to find procedure definitions in a
library. A library is simply a file that contain procedure definitions.
Libraries can explictly be read using source command.
2 Expect
The expect suite actually consist just of a few commands: expect, send, spawn
and interact and is an extension to TCL.
Before the expect command can be used a program must be spawned, see
expect commands below.
expect / {match1} {action1} / {match2} {action2} / {match3} {action3} / {match4} {action4}It is possible that no such output is encountered within the time period
defined by the timeout (variable name "timeout" in seconds, default to 2). In
this case expect stops waiting and continues with the next command in the
script.
You can use '*' to match any characters. You can also match using []
syntax and similar.
expect "/[a-f0-9]" ; # strongly preferred as /n and similar is not taken as litteral charactesr / and n.expect {a-f0-9} ; # can also be usedA note on / characters. The pattern matcher translate /x to x but this is done
once before the pattern matcher. So you need to type //n to match n. This is
especially important for * and ? characters.
expect "*" ;# match anything (*)expect "/n" ;# match linefieedexpect "/*" ;# match anythingexpect "//*" ;# match * characterexpect "///*" ;# match * characterexpect "////*" ;# match / followed by anythingexpect "/////*" ;# match / followed by anythingexpect "//////*" ;# match / followed * characterThe [ character is special to both tcl and the pattern matcher so it is
especially messy.
proc xy {} { return "n*w" }expect "[xy]" ;# match n followed by anything followed by wexpect "/[xy]" ;# match x or yexpect "//[xy]" ;# match n followed by anything followed by wexpect "///[xy]" ;# match [xy]expect "////[xy]" ;# match / followed by n followed ...expect "/////[xy]" ;# match sequence of / and then x or y.The expect command can also take flags. The default flag is -gl for glob
pattern matching. It can also take the flag -re for regular expression
matching.
expect { -re "a*" { action_when_a_followed_by_any_a } "b*" { action_when_b_followed_by_anything } -gl "-re" { action_when_real_dash_r_e } eof { action_on_end_of_file } timeout { action_on_command_timeout } default { action_on_command_timeout_or_eof } -re "(abc)*" { action_on_any_number_of_a_b_c } -re "-?(0|/[1-9]/[0-9]*)?//.?/[0-9]*" { action_on_float_or_integer }}You can also pass the pattern as a variable.
set v2pats "pat2 act2"set v3pats "pat3 act3"expect pat1 act1 $v2pats $v3patsObserve that the following expect string is wrong as $v2pats and $v3pats
is considered as two different arguments. It will try to match $v2pats
as a pattern and $v3pats as an action. Instead build up a string and use
the -brace flag. You can not use double quotes for that though, unless you
use eval and then the -brace flag is not necessary. You also need to protect
the pattern and action inside a [list x] or an extra brace if they contain
whitespaces.
2.1 Parentheses for feedback
In the previous section, parantheses were used to group subpatterns together.
They can also play another role. When a regular expression successfully
matches a string each part of the string that matches a paranthensized
subpattern is stored in "expect_out(1,string)" the second in
"expect_out(2,string)" etc up to "expect_out(9,string)".
The entire pattern matched is stored in "expect_out(0,string)". Everthing
before the pattern and the pattern matched is stored in "expect_out(buffer)".
The last two assignments work in glob pattern too.
"a*((ab)*|b)"How is this passed to expect_out? It is quite
simple. The entire string
withing the first parenthesis is stored in 1 (which means up to end of
string). The second fount parenthesis is stored in 2. Look for the left
parenthesis
to determine where the data is put.
2.2 Flags
-re |
|
-gl |
|
-nocase |
Ignore case. Do not use -nocase with uppercase characters in the pattern as it will never match. |
-notransfer |
Prevent expect from removing matching characters from the internal buffer. The characters can be matched repeatedly as long as this option is associated with the pattern. It can be abbreviated with "-n" when expect is running interactively. |
-brace |
Expect normally see the first argument as a pattern to match, but sometimes you want to give a list of patterns and actions to expect. You can then use -brace to expand the list before it is handled by expect. expect -brace { pat1 act1 pat2 act2 }This can be useful when building up lists of pattern to match with corresponding actions to do. |
-i n |
Use an alternative spawn_id. This applies to all patterns after the -i flag. expect { -i $ftp "ftp>" "exit" eof "exit"}You can also expect values from multiple spawned processes at the same time. At most one action can be executed just as expect normally do. expect { -i $ftp "ftp> " { ftp_action } -i $shell $prompt { shell_action }}There is an input buffer associated with each spawn id. So any output from ftp is kept separate from thta of the shell in the example above. When output appear on terminal it will be mixed, unless you expect one at a time or set log_user 0 and then wrote output explictly using send_user $expect_out(buffer). The process that did not match will keep its buffer until matched by next expect command. When the expect command match something it record the spawn_id to expect_out(spawn_id) so you can know which process that it matched against. You can also set the spawn_id definition to a list of spawn_ids. expect { -i "$host1 $host2 $host3" $prompt { an_action $expect_out(spawn_id) } eof exit -i $host1 another_pattern {host1_action}}This example will do an_action if $prompt is matched agains any of the $hostnr, exit if end of file is matched against same list and do host1_action if matchina another_pattern from host1. |
2.3 Special patterns
Note that these patcherns will only match if none of the '-gl', '-re' or '-ex'
flags has been used.
eof |
Match when end of file is reached. |
timeout |
Match when the timeout value has been reached. |
default |
Match when end of file or timeout is reached. |
full_buffer |
Match when no other pattern match and expect would otherwise throw away part of the input to make room fore more. When this matches, all of the unmatched input is moved to expect_out(buffer). |
null |
By default null characters are removed from the buffer before expect matching is done. This can be disabled using the remove_nulls command below. If it is disabled null characters will be matched using this special keyword. Null characters can not be matched inside a pattern as expect first look for null characters and then do pattern matching. If a null character is found the characters before it is skilled. These caracters can be found in expect_out(buffer). Since the null character is used internally to represent the end of a string unanchored patterns cannot be matched past a null. This is not a problem since null pattern can always be listed last. |
2.4 Expect variables
expect_out |
|
spawn_id |
|
user_spawn_id |
Predefined variable that refer to standard input and standard output. |
error_spawn_id |
Predefined variable that refer to standard error. |
tty_spawn_id |
Predefined variable that refer to controlling termina (i.e. /dev/tty). |
any_spawn_id |
A special global variable predefined to any spawn_id mentioned earlier in the current expect command. |
2.5 Expect commands
The expect commands treat scope a bit differently from other commands. If
they are used in procedures they will first look up the local scope. If one
of the expect variables (like timeout etc) is not defined there it look up
the variable in the global scope. This is not the normal behaviour so you
should note that.
When writing a variable only one scope is used. The local scope will be
used unless a global directive is used. This is important to know.
expect_user |
Same as expect but expect data from standard input. Same as 'expect -i $tty_spawn_id'. |
expect_tty |
Same as expect_user but read from terminal device even if standard input is redirected. Same as 'expect -i $tty_spawn_id'. |
exp_continue |
In some cases you may want to continue the expect matching even if a match has occured. You can then use the command exp_continue to re_execute the expect command but the buffered data up to the current match discarded. When exp_continue action is expecuted the timeout variable is reread. To avoid resetting the timer the flag -continue_timer can be used as a flag to exp_continue. |
expect_before |
Sometimes it is useful to declare patterns that are used automatically by expect commands. It takes the same arguments as expect do and prepend this list to the normal expect list. The effect of this command for a specific spawn_id remain until next expect_before change something for the specific spawn_id. Running expect after this will apply all expect_before patterns for all specified spawn_id:s to the expect list. Observe! When an expect_before command is used without any explicit spawn_id, the pattern is associated with the current spawn_id rather than the spawn_id used in the expect statement. |
expect_after |
See expect_before but with the difference that the list is appended to the expect list instead of prepended. |
log_file |
The default is to log everything to stdout. This can be redirected to file using log_file. If you use the flag -noappend the log file will be truncated before data is written to it. The log command can also be used with the -a flag so it log everything even output that is normally surpressed. |
log_user |
Log to stdout can also be disabled using log_user 0 and enabled again using log_user 1. |
send |
Send characters to a spawned command. Notice that each line sent is terminated with the '/r' character. This is what a return charater pressed so that is what Expect has to send. Output sent to the user (or stdout) is indeed terminated with the '/n' character. Similarly a program that normally is used by a terminal you will see a '/r/n' sequence. Send can also take the argument '-i n' where n is a spawn_id. |
send_user |
Same as send but directed to stdout just as puts but with two important differences. The first is that it do not add a newline and the second is that it is also logged to the log file (if specified). If log_user has been used to disable output send_user still send such output. This means that you normally want to use send_user instead of puts in expect scripts. Same as 'send -i $user_spawn_id'. |
send_error |
Works in a similar to send_user but output is directed to standard error instead of standard output. Same as 'send -i $error_spawn_id'. |
send_tty |
Works in a similar way to send_user but can not be redirected. Expect is one of the few commands that have the power to redirect communications directly to and/or from /dev/tty. Same as 'send -i $tty_spawn_id'. |
spawn |
Spawn a command. spawn telnet localhostYou can now use send and expect on the spawned command. Status if the command was successful or not is stored in the variable $?. |
match_max |
When a program produce lot of output this can cause a problem because the computer memory is limited. Therefore expect guarantee that the last 2000 characters will be matched. This is the same as a 25 row, 80 column screen. In order to change this guaranteed value you can set it using match_max command. Internally Expect allocates double the value match_max in order to have good performance, so double the value can be matched. To specify the default for all current spawned programs, use the -d flag. This do not change the size for the current spawned process. With no arguments the command return the current value (the default value if -d flag is used). |
remove_nulls |
Removal of null characters can be enabled (parameter = 1) or disabled (parameter = 0) with this command. The flag -d will set the default just as match_max and is handled similarly. |
parity |
Normally expect respect parity bits. Such bits can be stripped with this command and works siliarly to remove_nulls and match_max. |
interact |
Let the user interact with the spawned command. |
exp_internal |
This command is useful for debugging expect matches. Set to 1 to enable debugging and set to 0 to disable. This command can take the flag -f followed by a filename where the internal logging will be put. exp_internal 0 # no diagnosticsexp_internal 1 # diagnostics to standard errorexp_internal -f file 0 # std out and diagnostics to fileexp_internal -f file 1 # std out and diagnostics to file and standard error |
2.6 Manage multiple commands
Each spawned command has a spawn_id associated to it. By setting the
variable spawn_id you can switch back and forth between different spawned
processes. Both the expect and send commands honor this variable. Other
commands that honor this are: interact, close, wait, match_max, parity,
remove_nulls and some more.
Even exp_continue honor spawn_id so the process can be switched in the
middle of an expect statement.
foreach $spawn_id $spaws_ids { close wait}Close and wait for all spawned commands in the list.
2.7 Terminal modes
The terminal mode can be changed using the stty command similarly as the
UNIX stty command do. This is useful with the expect_user command is used.
stty raw |
Raw mode enabled. Keystrokes are not interpreted in any way by the terminal driver. Once the terminal is in raw mode, patterns without /n match without the user pressing return key. |
stty cooked |
Opposit of stty raw. |
stty -cooked |
Opposit of stty -raw. |
stty -raw |
Set back to line-oriented mode. |
stty -echo |
Disable echoing. Useful for example when user is about to enter a password. |
stty echo |
Enable echoing. |
stty rows n |
Set the number of rows to n. If no argument the current number of rows is returned. |
stty columns n |
Set the number of columns to n. If no argument the current number of colums is returned. |
stty < /dev/ttyXX |
Set the named terminal. |
stty cmd < /dev/ttyXX |
Any stty command can be applied to other terminals. The terminal settings can also queried this way. |
If stty has no arguments it will return system specific output from the
UNIX stty command. The output may vary from system to system. The parameters
are portable though.
3 TCL commands
set |
Set a variable to value or a list of values and return the values. If no argument is given then the value of the variable is returned. % set b 11% set b1% set xc 11% set b xx% set d [set [set b]c] ; set d to the value of xc1Replacing the set notation with $ can fail. % set a(1) foofoo% set a2 aa% puts [set [set a2](1)]foo% puts [set $a2(1)]can't read "a2(1)": variable isn't array% puts $[set a2](1)$a(1)% puts [$[set a2](1)]invalid command name "$a(1)"You can also set a variable name that contain whitespaces if you quote it properly. % set "a b" 11 |
unset |
Unset a variable, array element or entire array. unset aunset array(elf)unset array |
expr |
You can valuate expressions using the expr command. expr $count < 0expr {$count < 0}The above two are equal. Unquoted expressions is not allowed inside expressions to avoid ambigous statements unless they are numbers. So the following is not allowed: expr {$name == Don}Avoid expr for these implicit string operations as expr tries to interpret strings as numbers. Only if they are not numbers they are treated as strings. The "string compare" operation is better for string comparision. % expr {2E5000=="1E5000"}floating-point value too large to represent |
exec |
UNIX commands can be executed using the exec command. The arguments generally follow the /bin/sh-like conventions as open including >, <, |, 'litterl and' and variations on them. Use whitespace before and after redirection symbols.% exec dateTue Dec 28 16:06:22 MET 2004% puts "The date is [exec date]"The date is Tue Dec 28 16:14:14 MET 2004The output is returned so it can be used in variables. Tcl assumes that UNIX commands exit with value 0 if successful. Use catch to test whether a program succeeds or not. Many programs return 0 even if unsuccessful though. Tilde substituion is performed on on the command but not on the arguments, and no globbing is done at all, so you need to use the glob directive for that. exec rm -f [glob *.o]Beyond the /bin/sh conventions, exec supports special redirection to already open files using a '@' caracter directly after a redirection symbol. set handle [ open "/tmp/foo" "w" ]exec date >@ $handleExec also have some other exoteric features. |
system |
Similar to the exec command but do not redirect standard out or standard error. |
source |
Procedures and variables can be stored in other files and read using the source command. As the file is read, the commands are executed. source ~/def.tcl |
if |
if {expression} { expression} elseif {expression} { expression } else {expression} { expression } |
switch |
The switch command is similar to the if command but can take arguments and compare string values to a set of patterns. The first pattern matched will be used. Since switch support several flags '--' must be used as the final flag. If no patterns is matched the default target is used. The arguments available are:
- -glob turn shell pattern matching on. '?' match any character and
'*' match any string.
- -regexp turn regexp pattern matching on.
switch -glob -- $count / 1 { puts "Match one" } / 2 { puts "Match two" } / str1 { puts "String one matched" } / a*b { puts "Start with a and end with b using shell matching" default { puts "No match" } |
while |
while expression { expression } |
for |
for start evalexpression next { expression } The for statement will take four arguments: a start expression, an evaluation expression, a next value expression and finally the expression to loop. for { set a 0 } { a < 2 } { incr a } { puts a } |
break |
Break current while or for loop. |
continue |
Continue to next step in the while or for loop. |
proc |
It is possible to create functions or procedures with the "proc" and "return" commands. The return command can be omitted if it is not needed.proc name { list of variables } { expression }The proc command takes three arguments as specified above. When the name is defined it can then be used as a command: name 0 1 2Variables are local to the procedure unless "global" or "upvar" command is useed, see below. If the last argument is named args all the remaining arguments are stored in this list. This way a procedure can have variable number of arguments. |
global |
global variablename variablename2 ...Indicate that the variable with name variablename is in the global scope. |
upvar |
upvar $name1 a $name2 b ...Indicate the that procedure can change data in the callers scope for argument name1 using the name a and name2 using name b, etc. Use with care! upvar $name aset a 1 |
uplevel |
Similar to the upvar command but used to evaluate commands in the scope of the calling procedure. Use with care! uplevel incr xIncrements the variable x in the calling procedure. |
return |
Return a string and return from the procedure. |
exit |
Exit script and return a value. |
incr |
Increment a variable with one (default) or with the amount that the second variable specifies. |
trace |
Evaluate a procedure and trace variable access. |
catch |
catch { expression } optional_resultRun a procedure. If no abnormal behavoir was encountered it return 0 and if something got really bad it return 1 (true). The variable "optional_result" will be assigned to the value that the procedure return if everything goes ok. When run unsuccessfully it record the error messave in the variable "optional_result" and the full error information in the variable "errorInfo". |
error |
You can cause errors with the command error that can then be catched with the catch command. |
eval |
You can also evaluate strings in different ways. % set output putsputs% $output aaIf you want to evaluate an entire string you must use the eval command as it will treat the entire string as a command otherwise. % set a "puts /"a b c/""puts "a b c"% eval $aa b c |
sleep |
This command make expect/tcl sleep for a number of seconds. Any non negative floating number value is acceptable. It may sleep slightly longer than requested. sleep 2.5Sleeps for 2 and a half seconds. |
4 List manipulation
llength |
Return number of elements in the list. |
lindex |
Return value at a specific position in the list, starting on 0. |
lrange |
Return a range of values from the list starting at one position and ending on another position. |
foreach |
Iterating thought a list from front to back is so common that a command foreach has been defined. foreach element $list { expression }Each item in the list is assigned to the variable element. |
list |
To simplify the creation of lists you can use the list command. % lindex [list a b "Hello world"]Hello world |
concat |
Concatinates lists. % concat a {b {c d}}a b {c d} |
lappend |
|
linsert |
First argument is a list, the second argument is a numeric index and the rest are the arguments to insert. % set l {a b c d}a b c d% set l [linsert $l 0 new]new a b c d% linsert $l 1 foo bar {hello world}new foo bar {hello world} a b c d |
lreplace |
linsert $list startpos endpos valuesSame as linsert but delete the items before inserting. |
lsearch |
The lsearch is the opposite of lindex. It return the index where it can find the string and -1 if it can not find it. % learch {a b c d e} "b"1By default it use shell-type pattern matching and if you want to use exact matching use the -exact flag. % lsearch {a b c d e ?} "?"0% lsearch -exact {a b c d e ?} "?"5 |
lsort |
To sort a list lsort can be used. By default it sport the values in increasing order but flags can be used: -integer, -real, -decreasing. |
split |
Split a string into a list. % split "/etc/passwd "/"{} etc passwd |
join |
The reverse of split. The first argument is a list to join and the second argument is what to put between the elements. % join {{} etc passwd} "/"/etc/passwd |
5 Manipulating strings
Format and scan commands can be used to extract and create string based
on low level formats as integers.
format |
The first argument is a format string. Most characters in a format string is passed litterally but the ones after a '%' charater is treated differently. The rest of the arguments are used as values for the '%' definitions in the format string.
- '-' means left justify.
- a number indicates the minimum field width.
- 'c' treat as character (caracter 64 is '@' for example if ASCII is used).
- 'd' treat as decimal.
- 's' treat as string.
- 'f' treat as float number.
% set x [format "%3c,%4d%-8s==%20f" 64 2 foo 17.2] @, 2foo == 17.200000 |
scan |
The scan command is the opposit of format. It can also use the %*/[characters] syntax to exclude any number of caracters of specified type. % scan $x "%*/[ ]%c,%4d%8s%*/[ =]%f" char dec string float4% set char64% set dec2% set stringfoo% set float17.2 |
regexp |
regexp pattern string var0 var1 var2 var3 ...The regexp command patch a regexp pattern to a string and store the values from expect_out(i,string) to vari. Var0 is often ignored. The command return 1 when matched and 0 when not. % regexp (.*)@(.*) $addr ignore user host1% set userroot% set hostlocalhost |
regsub |
regsub pattern string newstring variableThe regsub command substitutes values matching pattern in string, replaces it with newstring into the named variable. Matched parenthesized patterns can be referred to inside the newstring as '/1', '/2' and so on up to '/9'. Entire string is referred to as '/0' as usual. |
string match |
string match "*.c" "main.c"Return true if they match. |
string first |
Return index of first occurance, -1 if none. |
string last |
Return index of last occurance, -1 if none. |
string length {foo} |
Return length of string. |
string index |
string index {abcedf} posReturn character at position, starting at 0. |
string range |
string range "abcdef" start endReturn string starting at first position and ending on last. |
string tolower |
Return converted string to lowercase characters. |
string toupper |
Return converted string to uppercase characters. |
string trimleft |
Removes characters from beginning of a string. The characters removed are any which appear on the second argument. If no second argument is provided, then whitespace is removed. |
string trimright |
Same as trimleft but right side is trimmed. |
append |
Appending is so common that a command is specified for this. % append var "abc"abc% append var "cde" "efg"abccdeefgAppend with two arguments is equal to: set var1 "$var1$var2" |
6 Internal information
With the info command you can obtain different kind of information about
internal information in tcl.
info exists |
Return 1 if the variable name is defined in the current scope. |
info locals, info globals, info vars |
Return a list of variable in local, global or all variables respectively. You can also specify a expression on what kind of variable names you want. % info globals mail* |
info depth |
Return information about the stack. If no argument it presented the stack depth is returned. info level 0Return command and arguments for the current procedure. info level -1Return command and arguments of the calling procedure. |
info script |
Return full path to the script being executed. |
info command |
Return information about a command or procedure. |
... |
There are more but not documented here. |
7 File operations
The open command opens a file and takes two arguments. The first is the file
to open and the second is how to open the file. "r" open the file for reading,
"a" append (write without truncate) and "w" truncate the file and then open
the file for writing.
The open command return a file identifier that can be passed to many
other file commands.
set handle [open "/etc/passwd" "r"] ; # open a fileclose $handle ; # close same fileThe open should be used with the catch command.
if { [catch {open "/etc/passwd" "r"} handle ] } { puts "Error open /etc/passwd."}else { while {[gets $handle line] != -1} { # do something with line }}You can also open commands. This is specified using the pipe character '|'
in the beginning of the string.
open "| ls * | grep -v {foo}"When you have done a close on a spawned process you have to use the wait
command (without arguments) in order to get rid of zombies. This is not needed
if exit is used as it wait for child processes anyway.
flush |
flush $handleFlush out cached data. |
puts |
puts $handle "Hello world"or to avoid adding a extra newline puts -nonewline $handle "Hello world" |
gets |
Gets takes a filehandle and an optional variable name to assign with the data read. It return the number of characters read or -1 if eof is reached. gets $handle line |
read |
Read takes two arguments, a file handle and a number of characters to read. set chunk [read $handle 10000]The characters read may be less than specified if there are no more characters left to be read. |
eof |
Return 1 if end of file has been encountered (by read or gets) otherwise it will return 0. |
seek |
Analogous to UNIX lseek system call. |
tell |
Analogous to UNIX tell system call. |
glob |
Return a list of names matching the arguments using shell pattern matching. glob *.c *.hAn error occurs if no file is matched, unless you use the "-nocomplain" flag. Most characters understood by the shell can be used for matching including '~', '?', '*', '[]', '{}'. |
file dirname |
file dirname $pathReturn the directory name for the file specified. |
file extension |
file extension $pathReturn file extension of the file specified. Empty string if there is no dot character. |
file rootname |
Return everything (full path) but the extension. |
file size |
Return number of bytes in file. |
file exists |
True if path exits. |
file isdirectory |
True if this is a directory. |
file isfile |
True if this is a file. |
file executable |
True if you have permission to execute file. |
file owned |
Return true if you own file. |
file readable |
True if you have permission to read from file. |
file writable |
True if you have permission to write to file. |
file atime |
Return last accessed time in seconds since January 1, 1970. |
file mtime |
Return last modified time in seconds since January 1, 1970. |
file type |
Return the file type: file, directory, characterSpecial, blockSpecial, link or socket. |
file readlink |
Return the name to which the file points to assuming it is a symbolic link. |
file stat |
If you want raw information from the inode you can use file stat. It takes to arguments, a path and name where to assign the array of information. file stat $path arrElements written to arr is: atime, ctime, mtime, type, uid, gid, ino, mode, nlink, dev, size. They are all integers except type that is specified as before. If the file is a symbolic link then "file stat" return information to where the link points. If information is wanted about the symbolic link itself, then use "file lstat" instead. |
8 Built in variables
pid |
Process id of the tcl/expect process. |
env |
There is an array named env that contain all environment variables. |
argv |
List of arguments to the expect program. You need the -- option to expect in order to make this work correctly. |
9 References