The command exp_continue allows expect itself to continue execut‐
ing rather than returning as it normally would. By default
exp_continue resets the timeout timer. The -continue_timer flag
prevents timer from being restarted. (See expect for more infor‐
mation.)
exp_internal [-f file] value
causes further commands to send diagnostic information internal
to Expect to stderr if value is non-zero. This output is dis‐
abled if value is 0. The diagnostic information includes every
character received, and every attempt made to match the current
output against the patterns.
If the optional file is supplied, all normal and debugging output
is written to that file (regardless of the value of value). Any
previous diagnostic output file is closed.
The -info flag causes exp_internal to return a description of the
most recent non-info arguments given.
exp_open [args] [-i spawn_id]
returns a Tcl file identifier that corresponds to the original
spawn id. The file identifier can then be used as if it were
opened by Tcl's open command. (The spawn id should no longer be
used. A wait should not be executed.
The -leaveopen flag leaves the spawn id open for access through
Expect commands. A wait must be executed on the spawn id.
exp_pid [-i spawn_id]
returns the process id corresponding to the currently spawned
process. If the -i flag is used, the pid returned corresponds to
that of the given spawn id.
exp_send
is an alias for send.
exp_send_error
is an alias for send_error.
exp_send_log
is an alias for send_log.
exp_send_tty
is an alias for send_tty.
exp_send_user
is an alias for send_user.
exp_version [[-exit] version]
is useful for assuring that the script is compatible with the
current version of Expect.
With no arguments, the current version of Expect is returned.
This version may then be encoded in your script. If you actually
know that you are not using features of recent versions, you can
specify an earlier version.
Versions consist of three numbers separated by dots. First is
the major number. Scripts written for versions of Expect with a
different major number will almost certainly not work. exp_ver‐
sion returns an error if the major numbers do not match.
Second is the minor number. Scripts written for a version with a
greater minor number than the current version may depend upon
some new feature and might not run. exp_version returns an error
if the major numbers match, but the script minor number is
greater than that of the running Expect.
Third is a number that plays no part in the version comparison.
However, it is incremented when the Expect software distribution
is changed in any way, such as by additional documentation or op‐
timization. It is reset to 0 upon each new minor version.
With the -exit flag, Expect prints an error and exits if the ver‐
sion is out of date.
等候 spawn 的 process 輸出直到符合其中一個 pattern、EOF、或 timeout。If the final body is empty, it may be omitted.
Patterns from the most recent expect_before command are implicitly used before any other patterns. Patterns from the most recent expect_after command are implicitly used after any other patterns.
If the arguments to the entire expect statement 需要跨多行,可以 "braced" into one 來避免每行以 backslash 結束。the usual Tcl substitutions will occur despite the braces。
如果 pattern 是 keyword eof,the corresponding body is executed upon end-of-file. If a pattern is the keyword timeout, the corresponding body is executed upon timeout. If no timeout keyword is used, an implicit null action is executed upon timeout。預設 timeout 是 10 秒,但 may be set, for example to 30, by the command "set timeout 30". An infinite timeout may be designated by the value -1. If a pattern is the keyword default, the corresponding body is executed upon either timeout or end-of-file.
If a pattern matches, then the corresponding body is executed. expect returns the result of the body (or the empty string if no pattern matched).
Each time new output arrives, it is compared to each pattern in
the order they are listed. Thus, you may test for absence of a
match by making the last pattern something guaranteed to appear,
such as a prompt. In situations where there is no prompt, you
must use timeout (just like you would if you were interacting
manually).
Patterns are specified in three ways. 預設用 Tcl 的 string match 指令,(Such patterns are
also similar to C-shell regular expressions usually referred to
as "glob" patterns). The -gl flag may may be used to protect
patterns that might otherwise match expect flags from doing so.
Any pattern beginning with a "-" should be protected this way.
(All strings starting with "-" are reserved for future options.)
For example, the following fragment looks for a successful login.
(Note that abort is presumed to be a procedure defined elsewhere
in the script.)
expect {
busy {puts busy\n ; exp_continue}
failed abort
"invalid password" abort
timeout abort
connected
}
Quotes are necessary on the fourth pattern since it contains a space, which would otherwise separate the pattern from the action. More information on forming glob-style patterns can be found in the Tcl manual.
Regexp-style patterns follow the syntax defined by Tcl's regexp command. regexp patterns are introduced with the flag -re. The previous example can be rewritten using a regexp as:
expect {
busy {puts busy\n ; exp_continue}
-re "failed|invalid password" abort
timeout abort
connected
}
Both types of patterns are "unanchored". This means that patterns do not have to match the entire string, but can begin and
end the match anywhere in the string (as long as everything else
matches). Use ^ to match the beginning of a string, and $ to
match the end. Note that if you do not wait for the end of a
string, your responses can easily end up in the middle of the
string as they are echoed from the spawned process. While still
producing correct results, the output can look unnatural. Thus,
use of $ is encouraged if you can exactly describe the characters
at the end of a string.
Note that in many editors, the ^ and $ match the beginning and end of lines respectively. However, because expect is not line oriented, these characters match the beginning and end of the data (as opposed to lines) currently in the expect matching buffer. (Also, see the note below on "system indigestion.")
-ex:the pattern to be matched as an "exact" string. No interpretation of *, ^, etc is made (although the usual Tcl conventions must still be observed). Exact patterns are always unanchored.
-nocase:大寫輸出視為小寫。不影響 pattern。
While reading output, more than 2000 bytes can force earlier
bytes to be "forgotten". This may be changed with the function
match_max. (Note that excessively large values can slow down the
pattern matcher.) If patlist is full_buffer, the corresponding
body is executed if match_max bytes have been received and no
other patterns have matched. Whether or not the full_buffer key‐
word is used, the forgotten characters are written to ex‐
pect_out(buffer).
If patlist is the keyword null, and nulls are allowed (via the
remove_nulls command), the corresponding body is executed if a
single ASCII 0 is matched. It is not possible to match 0 bytes
via glob or regexp patterns.
Upon matching a pattern (or eof or full_buffer), any matching and
previously unmatched output is saved in the variable ex‐
pect_out(buffer). Up to 9 regexp substring matches are saved in
the variables expect_out(1,string) through expect_out(9,string).
If the -indices flag is used before a pattern, the starting and
ending indices (in a form suitable for lrange) of the 10 strings
are stored in the variables expect_out(X,start) and ex‐
pect_out(X,end) where X is a digit, corresponds to the substring
position in the buffer. 0 refers to strings which matched the
entire pattern and is generated for glob patterns as well as reg‐
exp patterns. For example, if a process has produced output of
"abcdefgh\n", the result of:
expect "cd"
is as if the following statements had executed:
set expect_out(0,string) cd
set expect_out(buffer) abcd
and "efgh\n" is left in the output buffer. If a process produced the output "abbbcabkkkka\n", the result of:
expect -indices -re "b(b*).*(k+)"
is as if the following statements had executed:
set expect_out(0,start) 1
set expect_out(0,end) 10
set expect_out(0,string) bbbcabkkkk
set expect_out(1,start) 2
set expect_out(1,end) 3
set expect_out(1,string) bb
set expect_out(2,start) 10
set expect_out(2,end) 10
set expect_out(2,string) k
set expect_out(buffer) abbbcabkkkk
and "a\n" is left in the output buffer. The pattern "*" (and -re ".*") will flush the output buffer without reading any more output from the process.
Normally, the matched output is discarded from Expect's internal
buffers. This may be prevented by prefixing a pattern with the
-notransfer flag. This flag is especially useful in experiment‐
ing (and can be abbreviated to "-not" for convenience while ex‐
perimenting).
The spawn id associated with the matching output (or eof or
full_buffer) is stored in expect_out(spawn_id).
-timeout:the current expect command to use the following value as a timeout instead of using the value of the timeout variable.
By default, patterns are matched against output from the current
process, however the -i flag declares the output from the named
spawn_id list be matched against any following patterns (up to
the next -i). The spawn_id list should either be a whitespace
separated list of spawn_ids or a variable referring to such a
list of spawn_ids.
For example, the following example waits for "connected" from the current process, or "busy", "failed" or "invalid password" from the spawn_id named by $proc2.
expect {
-i $proc2 busy {puts busy\n ; exp_continue}
-re "failed|invalid password" abort
timeout abort
connected
}
The value of the global variable any_spawn_id may be used to match patterns to any spawn_ids that are named with all other -i flags in the current expect command. The spawn_id from a -i flag with no associated pattern (i.e., followed immediately by another -i) is made available to any other patterns in the same expect command associated with any_spawn_id.
The -i flag may also name a global variable in which case the
variable is read for a list of spawn ids. The variable is reread
whenever it changes. This provides a way of changing the I/O
source while the command is in execution. Spawn ids provided
this way are called "indirect" spawn ids.
Actions such as break and continue cause control structures
(i.e., for, proc) to behave in the usual way. The command
exp_continue allows expect itself to continue executing rather
than returning as it normally would.
This is useful for avoiding explicit loops or repeated expect
statements. The following example is part of a fragment to auto‐
mate rlogin. The exp_continue avoids having to write a second
expect statement (to look for the prompt again) if the rlogin
prompts for a password.
expect {
Password: {
stty -echo
send_user "password (for $user) on $host: "
expect_user -re "(.*)\n"
send_user "\n"
send "$expect_out(1,string)\r"
stty echo
exp_continue
} incorrect {
send_user "invalid password or account\n"
exit
} timeout {
send_user "connection to $host timed out\n"
exit
} eof {
send_user \
"connection to host failed: $expect_out(buffer)"
exit
} -re $prompt
}
For example, the following fragment might help a user guide an
interaction that is already totally automated. In this case, the
terminal is put into raw mode. If the user presses "+", a vari‐
able is incremented. If "p" is pressed, several returns are sent
to the process, perhaps to poke it in some way, and "i" lets the
user interact with the process, effectively stealing away control
from the script. In each case, the exp_continue allows the cur‐
rent expect to continue pattern matching after executing the cur‐
rent action.
stty raw -echo
expect_after {
-i $user_spawn_id
"p" {send "\r\r\r"; exp_continue}
"+" {incr foo; exp_continue}
"i" {interact; exp_continue}
"quit" exit
}
By default, exp_continue resets the timeout timer. The timer is
not restarted, if exp_continue is called with the -continue_timer
flag.