summaryrefslogtreecommitdiff
path: root/expect.man
diff options
context:
space:
mode:
authorAnas Nashif <anas.nashif@intel.com>2012-11-04 17:21:04 -0800
committerAnas Nashif <anas.nashif@intel.com>2012-11-04 17:21:04 -0800
commite0b431a48cc3ac5d3ec32f06eddd9708ad655fa2 (patch)
treece4c73521220fbb751c2be6a42e85ff6a6cbff97 /expect.man
downloadexpect-e0b431a48cc3ac5d3ec32f06eddd9708ad655fa2.tar.gz
expect-e0b431a48cc3ac5d3ec32f06eddd9708ad655fa2.tar.bz2
expect-e0b431a48cc3ac5d3ec32f06eddd9708ad655fa2.zip
Imported Upstream version 5.45upstream/5.45
Diffstat (limited to 'expect.man')
-rw-r--r--expect.man2613
1 files changed, 2613 insertions, 0 deletions
diff --git a/expect.man b/expect.man
new file mode 100644
index 0000000..1ac0c3f
--- /dev/null
+++ b/expect.man
@@ -0,0 +1,2613 @@
+.TH EXPECT 1 "29 December 1994"
+.SH NAME
+expect \- programmed dialogue with interactive programs, Version 5
+.SH SYNOPSIS
+.B expect
+[
+.B \-dDinN
+]
+[
+.B \-c
+.I cmds
+]
+[
+[
+.BR \- [ f | b ]
+]
+.I cmdfile
+]
+[
+.I args
+]
+.SH INTRODUCTION
+.B Expect
+is a program that "talks" to other interactive programs according to a
+script. Following the script,
+.B Expect
+knows what can be expected from
+a program and what the correct response should be. An interpreted
+language provides branching and high-level control structures to
+direct the dialogue. In addition, the user can take control
+and interact directly when desired, afterward returning control to the
+script.
+.PP
+.B Expectk
+is a mixture of
+.B Expect
+and
+.BR Tk .
+It behaves just like
+.B Expect
+and
+.BR Tk 's
+.BR wish .
+.B Expect
+can also be used directly in C or C++ (that is, without Tcl).
+See libexpect(3).
+.PP
+The name "Expect" comes from the idea of
+.I send/expect
+sequences popularized
+by uucp, kermit and other modem control programs.
+However unlike uucp,
+.B Expect
+is generalized so that it can be run as a user-level command
+with any program and task in mind.
+.B Expect
+can actually talk to several programs at the same time.
+.PP
+For example, here are some things
+.B Expect
+can do:
+.RS
+.TP 4
+\(bu
+Cause your computer to dial you back,
+so that you can login without paying for the call.
+.TP
+\(bu
+Start a game (e.g., rogue) and if the optimal configuration doesn't appear,
+restart it (again and again) until it does,
+then hand over control to you.
+.TP
+\(bu
+Run fsck, and in response to its questions, answer "yes", "no" or give control back to you,
+based on predetermined criteria.
+.TP
+\(bu
+Connect to another network or BBS (e.g., MCI Mail, CompuServe) and
+automatically retrieve your mail so that it appears as if
+it was originally sent to your local system.
+.TP
+\(bu
+Carry environment variables, current directory,
+or any kind of information across rlogin, telnet, tip, su, chgrp, etc.
+.RE
+.PP
+There are a variety of reasons why the shell cannot perform these tasks.
+(Try, you'll see.)
+All are possible with
+.BR Expect .
+.PP
+In general,
+.B Expect
+is useful for running any program which requires
+interaction between the program and the user.
+All that is necessary is that the interaction can be characterized
+programmatically.
+.B Expect
+can also give the user back control
+(without halting the program being controlled) if desired.
+Similarly, the user can return control to the script at any time.
+.SH USAGE
+.B Expect
+reads
+.I cmdfile
+for a list of commands to execute.
+.B Expect
+may also be invoked implicitly on systems which support the #! notation
+by marking the script executable, and making the first line in your script:
+
+ #!/usr/local/bin/expect \-f
+
+Of course, the path must accurately describe where
+.B Expect
+lives. /usr/local/bin is just an example.
+
+The
+.B \-c
+flag prefaces a command to be executed before any in the script.
+The command should be quoted to prevent being broken up by the shell.
+This option may be used multiple times.
+Multiple commands may be
+executed with a single
+.B \-c
+by separating them with semicolons.
+Commands are executed in the order they appear.
+(When using Expectk, this option is specified as
+.BR \-command .)
+.PP
+The
+.B \-d
+flag enables some diagnostic output, which
+primarily reports internal activity of commands such as
+.B expect
+and
+.BR interact .
+This flag has the same effect as "exp_internal 1" at the beginning of an Expect
+script, plus the version of
+.B Expect
+is printed.
+(The
+.B strace
+command is useful for tracing statements, and the
+.B trace
+command is useful for tracing variable assignments.)
+(When using Expectk, this option is specified as
+.BR \-diag .)
+.PP
+The
+.B \-D
+flag enables an interactive debugger. An integer value should follow.
+The debugger will take control before the next Tcl procedure
+if the value is non-zero
+or if a ^C is pressed (or a breakpoint is hit, or other appropriate debugger
+command appears in the script). See the README file or SEE ALSO (below)
+for more information on the debugger.
+(When using Expectk, this option is specified as
+.BR \-Debug .)
+.PP
+The
+.B \-f
+flag prefaces a file from which to read commands from.
+The flag itself is optional as it is only useful when using
+the #! notation (see above),
+so that other arguments may be supplied on the command line.
+(When using Expectk, this option is specified as
+.BR \-file .)
+.PP
+By default, the command file is read into memory and executed in its entirety.
+It is occasionally desirable to read files one line at a time. For example,
+stdin is read this way. In order to force arbitrary files to be handled this
+way, use the
+.B \-b
+flag.
+(When using Expectk, this option is specified as
+.BR \-buffer .) Note that stdio-buffering may still take place however this shouldn't cause problems when reading from a fifo or stdin.
+.PP
+If the string "\-" is supplied as a filename, standard input is read instead.
+(Use "./\-" to read from a file actually named "\-".)
+.PP
+The
+.B \-i
+flag causes
+.B Expect
+to interactively prompt for commands instead of reading
+them from a file.
+Prompting is terminated via the
+.B exit
+command or upon EOF.
+See
+.B interpreter
+(below) for more information.
+.B \-i
+is assumed if neither a command file nor
+.B \-c
+is used.
+(When using Expectk, this option is specified as
+.BR \-interactive .)
+.PP
+.B \-\-
+may be used to delimit the end of the options. This is useful if
+you want to pass an option-like argument to your script without it being
+interpreted by
+.BR Expect .
+This can usefully be placed in the #! line to prevent any flag-like
+interpretation by Expect. For example, the following will leave the
+original arguments (including the script name) in the variable
+.IR argv .
+
+ #!/usr/local/bin/expect \-\-
+
+Note that the usual getopt(3) and execve(2) conventions must be observed
+when adding arguments to the #! line.
+.PP
+The file $exp_library/expect.rc is sourced automatically if present, unless
+the
+.B \-N
+flag is used.
+(When using Expectk, this option is specified as
+.BR \-NORC .)
+Immediately after this,
+the file ~/.expect.rc is sourced automatically, unless the
+.B \-n
+flag is used. If the environment variable DOTDIR is defined,
+it is treated as a directory and .expect.rc is read from there.
+(When using Expectk, this option is specified as
+.BR \-norc .)
+This sourcing occurs only after executing any
+.B \-c
+flags.
+.PP
+.B \-v
+causes Expect to print its version number and exit. (The corresponding flag
+in Expectk, which uses long flag names, is \-version.)
+.PP
+Optional
+.I args
+are constructed into a list and stored in the variable named
+.IR argv .
+.I argc
+is initialized to the length of argv.
+.PP
+.I argv0
+is defined to be the name of the script (or binary if no script is used).
+For example,
+the following prints out the name of the script and the first three arguments:
+.nf
+
+ send_user "$argv0 [lrange $argv 0 2]\\n"
+
+.fi
+.SH COMMANDS
+.B Expect
+uses
+.I Tcl
+(Tool Command Language).
+Tcl provides control flow (e.g., if, for, break),
+expression evaluation and several other features such as recursion,
+procedure definition, etc.
+Commands used here but not defined (e.g.,
+.BR set ,
+.BR if ,
+.BR exec )
+are Tcl commands (see tcl(3)).
+.B Expect
+supports additional commands, described below.
+Unless otherwise specified, commands return the empty string.
+.PP
+Commands are listed alphabetically so that they can be quickly located.
+However, new users may find it easier to start by reading the descriptions
+of
+.BR spawn ,
+.BR send ,
+.BR expect ,
+and
+.BR interact ,
+in that order.
+
+Note that the best introduction to the language (both Expect and Tcl)
+is provided in the book "Exploring Expect" (see SEE ALSO below).
+Examples are included in this man page but they are very limited since
+this man page is meant primarily as reference material.
+
+Note that in the text of this man page, "Expect" with an uppercase "E"
+refers to the
+.B Expect
+program while "expect" with a lower-case "e" refers to the
+.B expect
+command within the
+.B Expect
+program.)
+.I
+.TP 6
+.BI close " [-slave] [\-onexec 0|1] [\-i spawn_id]"
+closes the connection to the current process.
+Most interactive programs will detect EOF on their stdin and exit;
+thus
+.B close
+usually suffices to kill the process as well.
+The
+.B \-i
+flag declares the process to close corresponding to the named spawn_id.
+
+Both
+.B expect
+and
+.B interact
+will detect when the current process exits and implicitly do a
+.BR close .
+But if you kill the process by, say, "exec kill $pid",
+you will need to explicitly call
+.BR close .
+
+The
+.BR \-onexec
+flag determines whether the spawn id will be closed in any new spawned
+processes or if the process is overlayed. To leave a spawn id open,
+use the value 0. A non-zero integer value will force the spawn closed
+(the default) in any new processes.
+
+The
+.B \-slave
+flag closes the slave associated with the spawn id. (See "spawn -pty".)
+When the connection is closed, the slave is automatically closed as
+well if still open.
+
+No matter whether the connection is closed implicitly or explicitly,
+you should call
+.B wait
+to clear up the corresponding kernel process slot.
+.B close
+does not call
+.B wait
+since there is no guarantee that closing a process connection will cause
+it to exit.
+See
+.B wait
+below for more info.
+.TP
+.BI debug " [[-now] 0|1]"
+controls a Tcl debugger allowing you to step through statements, set
+breakpoints, etc.
+
+With no arguments, a 1 is returned if the debugger is not running, otherwise
+a 0 is returned.
+
+With a 1 argument, the debugger is started. With a 0 argument, the
+debugger is stopped. If a 1 argument is preceded by the
+.B \-now
+flag, the debugger is started immediately (i.e., in the middle of the
+.B debug
+command itself). Otherwise, the debugger is started with the next
+Tcl statement.
+
+The
+.B debug
+command does not change any traps. Compare this to starting Expect with the
+.B -D
+flag (see above).
+
+See the README file or SEE ALSO (below)
+for more information on the debugger.
+.TP
+.B disconnect
+disconnects a forked process from the terminal. It continues running in the
+background. The process is given its own process group (if possible).
+Standard I/O is redirected to /dev/null.
+.IP
+The following fragment uses
+.B disconnect
+to continue running the script in the background.
+.nf
+
+ if {[fork]!=0} exit
+ disconnect
+ . . .
+
+.fi
+The following script reads a password, and then runs a program
+every hour that demands a password each time it is run. The script supplies
+the password so that you only have to type it once.
+(See the
+.B stty
+command which demonstrates how to turn off password echoing.)
+.nf
+
+ send_user "password?\\ "
+ expect_user -re "(.*)\\n"
+ for {} 1 {} {
+ if {[fork]!=0} {sleep 3600;continue}
+ disconnect
+ spawn priv_prog
+ expect Password:
+ send "$expect_out(1,string)\\r"
+ . . .
+ exit
+ }
+
+.fi
+An advantage to using
+.B disconnect
+over the shell asynchronous process feature (&) is that
+.B Expect
+can
+save the terminal parameters prior to disconnection, and then later
+apply them to new ptys. With &,
+.B Expect
+does not have a chance
+to read the terminal's parameters since the terminal is already
+disconnected by the time
+.B Expect
+receives control.
+.TP
+.BI exit " [\-opts] [status]"
+causes
+.B Expect
+to exit or otherwise prepare to do so.
+
+The
+.B \-onexit
+flag causes the next argument to be used as an exit handler.
+Without an argument, the current exit handler is returned.
+
+The
+.B \-noexit
+flag causes
+.B Expect
+to prepare to exit but stop short of actually returning control to the
+operating system. The user-defined exit handler is run as well as Expect's
+own internal handlers.
+No further Expect commands should be executed.
+This is useful if you are running Expect with other Tcl extensions.
+The current interpreter (and main window if in the Tk environment) remain
+so that other Tcl extensions can clean up. If Expect's
+.B exit
+is called again (however this might occur), the handlers are not rerun.
+
+Upon exiting,
+all connections to spawned processes are closed. Closure will be detected
+as an EOF by spawned processes.
+.B exit
+takes no other actions beyond what the normal _exit(2) procedure does.
+Thus, spawned processes that do not check for EOF may continue to run.
+(A variety of conditions are important to determining, for example, what
+signals a spawned process will be sent, but these are system-dependent,
+typically documented under exit(3).)
+Spawned processes that continue to run will be inherited by init.
+
+.I status
+(or 0 if not specified) is returned as the exit status of
+.BR Expect .
+.B exit
+is implicitly executed if the end of the script is reached.
+.TP
+\fBexp_continue\fR [-continue_timer]
+The command
+.B exp_continue
+allows
+.B expect
+itself to continue
+executing rather than returning as it normally would. By
+default
+.B exp_continue
+resets the timeout timer. The
+.I -continue_timer
+flag prevents timer from being restarted. (See
+.B expect
+for more information.)
+.TP
+.BI exp_internal " [\-f file] value"
+causes further commands to send diagnostic information internal to
+.B Expect
+to stderr if
+.I value
+is non-zero. This output is disabled if
+.I value
+is 0. The diagnostic information includes every character received,
+and every attempt made to match the current output against the patterns.
+.IP
+If the optional
+.I file
+is supplied, all normal and debugging output is written to that file
+(regardless of the value of
+.IR value ).
+Any previous diagnostic output file is closed.
+
+The
+.B \-info
+flag causes exp_internal to return a description of the
+most recent non-info arguments given.
+.TP
+.BI 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
+.B open
+command. (The spawn id should no longer be used. A
+.B wait
+should not be executed.
+
+The
+.B \-leaveopen
+flag leaves the spawn id open for access through
+Expect commands. A
+.B wait
+must be executed on the spawn id.
+.TP
+.BI exp_pid " [\-i spawn_id]"
+returns the process id corresponding to the currently spawned process.
+If the
+.B \-i
+flag is used, the pid returned corresponds to that of the given spawn id.
+.TP
+.B exp_send
+is an alias for
+.BR send .
+.TP
+.B exp_send_error
+is an alias for
+.BR send_error .
+.TP
+.B exp_send_log
+is an alias for
+.BR send_log .
+.TP
+.B exp_send_tty
+is an alias for
+.BR send_tty .
+.TP
+.B exp_send_user
+is an alias for
+.BR send_user .
+.TP
+.BI exp_version " [[\-exit] version]"
+is useful for assuring that the script is compatible with the current
+version of Expect.
+.IP
+With no arguments, the current version of
+.B 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.
+.IP
+Versions consist of three numbers separated by dots. First
+is the major number. Scripts written for versions of
+.B Expect
+with a
+different major number will almost certainly not work.
+.B exp_version
+returns an error if the major numbers do not match.
+.IP
+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.
+.B exp_version
+returns an error if the major numbers match, but the script minor number
+is greater than that of the running
+.BR Expect .
+.IP
+Third is a number that plays no part in the version comparison.
+However, it is incremented when the
+.B Expect
+software
+distribution is changed in any way, such as by additional documentation
+or optimization. It is reset to 0 upon each new minor version.
+.IP
+With the
+.B \-exit
+flag,
+.B Expect
+prints an error and exits if the version is out of date.
+.TP
+.BI expect " [[\-opts] pat1 body1] ... [\-opts] patn [bodyn]"
+waits until one of the patterns matches the output of a spawned process,
+a specified time period has passed, or an end-of-file is seen.
+If the final body is empty, it may be omitted.
+.IP
+Patterns from the most recent
+.B expect_before
+command are implicitly used before any other patterns.
+Patterns from the most recent
+.B expect_after
+command are implicitly used after any other patterns.
+.IP
+If the arguments to the entire
+.B expect
+statement require more than one line,
+all the arguments may be "braced" into one so as to avoid terminating each
+line with a backslash. In this one case, the usual Tcl substitutions will
+occur despite the braces.
+.IP
+If a pattern is the keyword
+.BR eof ,
+the corresponding body is executed upon end-of-file.
+If a pattern is the keyword
+.BR timeout ,
+the corresponding body is executed upon timeout. If no timeout keyword
+is used, an implicit null action is executed upon timeout.
+The default timeout period is 10 seconds but 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
+.BR default ,
+the corresponding body is executed upon either timeout or end-of-file.
+.IP
+If a pattern matches, then the corresponding body is executed.
+.B expect
+returns the result of the body (or the empty string if no pattern matched).
+In the event that multiple patterns match, the one appearing first is
+used to select a body.
+.IP
+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
+.B timeout
+(just like you would if you were interacting manually).
+.IP
+Patterns are specified in three ways. By default,
+patterns are specified as with Tcl's
+.B string match
+command. (Such patterns are also similar to C-shell regular expressions
+usually referred to as "glob" patterns). The
+.B \-gl
+flag may may
+be used to protect patterns that might otherwise match
+.B expect
+flags from doing so.
+Any pattern beginning with a "-" should be protected this way. (All strings
+starting with "-" are reserved for future options.)
+
+.IP
+For example, the following fragment looks for a successful login.
+(Note that
+.B abort
+is presumed to be a procedure defined elsewhere in the script.)
+.nf
+
+.ta \w' expect 'u +\w'invalid password 'u
+ expect {
+ busy {puts busy\\n ; exp_continue}
+ failed abort
+ "invalid password" abort
+ timeout abort
+ connected
+ }
+
+.fi
+Quotes are necessary on the fourth pattern since it contains a space, which
+would otherwise separate the pattern from the action.
+Patterns with the same action (such as the 3rd and 4th) require listing the
+actions again. This can be avoid by using regexp-style patterns (see below).
+More information on forming glob-style patterns can be found in the Tcl manual.
+.IP
+Regexp-style patterns follow the syntax defined by Tcl's
+.B regexp
+(short for "regular expression") command.
+regexp patterns are introduced with the flag
+.BR \-re .
+The previous example can be rewritten using a regexp as:
+.nf
+
+.ta \w' expect 'u +\w'connected 'u
+ expect {
+ busy {puts busy\\n ; exp_continue}
+ \-re "failed|invalid password" abort
+ timeout abort
+ connected
+ }
+
+.fi
+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.")
+
+The
+.B \-ex
+flag causes 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.
+
+.IP
+The
+.B \-nocase
+flag causes uppercase characters of the output to compare as if they were
+lowercase characters. The pattern is not affected.
+.IP
+While reading output,
+more than 2000 bytes can force earlier bytes to be "forgotten".
+This may be changed with the function
+.BR match_max .
+(Note that excessively large values can slow down the pattern matcher.)
+If
+.I patlist
+is
+.BR full_buffer ,
+the corresponding body is executed if
+.I match_max
+bytes have been received and no other patterns have matched.
+Whether or not the
+.B full_buffer
+keyword is used, the forgotten characters are written to
+expect_out(buffer).
+
+If
+.I patlist
+is the keyword
+.BR null ,
+and nulls are allowed (via the
+.B 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
+.IR expect_out(buffer) .
+Up to 9 regexp substring matches are saved in the variables
+.I expect_out(1,string)
+through
+.IR expect_out(9,string) .
+If the
+.B -indices
+flag is used before a pattern,
+the starting and ending indices (in a form suitable for
+.BR lrange )
+of the
+10 strings are stored in the variables
+.I expect_out(X,start)
+and
+.I expect_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 regexp patterns.
+For example, if a process has produced output of "abcdefgh\\n", the result of:
+.nf
+
+ expect "cd"
+
+.fi
+is as if the following statements had executed:
+.nf
+
+ set expect_out(0,string) cd
+ set expect_out(buffer) abcd
+
+.fi
+and "efgh\\n" is left in the output buffer.
+If a process produced the output "abbbcabkkkka\\n", the result of:
+.nf
+
+ expect \-indices \-re "b(b*).*(k+)"
+
+.fi
+is as if the following statements had executed:
+.nf
+
+ 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
+
+.fi
+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.
+.IP
+Normally, the matched output is discarded from Expect's internal buffers.
+This may be prevented by prefixing a pattern with the
+.B \-notransfer
+flag. This flag is especially useful in experimenting (and can be
+abbreviated to "-not" for convenience while experimenting).
+
+The spawn id associated with the matching output (or eof or
+full_buffer) is stored in
+.IR expect_out(spawn_id) .
+
+The
+.B \-timeout
+flag causes 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
+.B \-i
+flag declares the output from the named spawn_id list be matched against
+any following patterns (up to the next
+.BR \-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.
+.nf
+
+ expect {
+ \-i $proc2 busy {puts busy\\n ; exp_continue}
+ \-re "failed|invalid password" abort
+ timeout abort
+ connected
+ }
+
+.fi
+The value of the global variable
+.I any_spawn_id
+may be used to match patterns to any spawn_ids that are named
+with all other
+.B \-i
+flags in the current
+.B expect
+command.
+The spawn_id from a
+.B \-i
+flag with no associated pattern (i.e., followed immediately
+by another
+.BR \-i )
+is made available to any other patterns
+in the same
+.B expect
+command associated with
+.I any_spawn_id.
+
+The
+.B \-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
+.B break
+and
+.B continue
+cause control structures (i.e.,
+.BR for ,
+.BR proc )
+to behave in the usual way.
+The command
+.B exp_continue
+allows
+.B expect
+itself to continue
+executing rather than returning as it normally would.
+.IP
+This is useful for avoiding explicit loops or repeated expect statements.
+The following example is part of a fragment to automate rlogin. The
+.B exp_continue
+avoids having to write a second
+.B expect
+statement (to look for the prompt again) if the rlogin prompts for a password.
+.nf
+
+ 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
+ }
+
+.fi
+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 variable 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
+.B exp_continue
+allows the current
+.B expect
+to continue pattern matching after executing the
+current action.
+.nf
+
+ 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
+ }
+
+.fi
+.IP
+By default,
+.B exp_continue
+resets the timeout timer. The timer is not restarted, if
+.B exp_continue
+is called with the
+.B \-continue_timer
+flag.
+.TP
+.BI expect_after " [expect_args]"
+works identically to the
+.B expect_before
+except that if patterns from both
+.B expect
+and
+.B expect_after
+can match, the
+.B expect
+pattern is used. See the
+.B expect_before
+command for more information.
+.TP
+.BI expect_background " [expect_args]"
+takes the same arguments as
+.BR expect ,
+however it returns immediately.
+Patterns are tested whenever new input arrives.
+The pattern
+.B timeout
+and
+.B default
+are meaningless to
+.BR expect_background
+and are silently discarded.
+Otherwise, the
+.B expect_background
+command uses
+.B expect_before
+and
+.B expect_after
+patterns just like
+.B expect
+does.
+
+When
+.B expect_background
+actions are being evaluated, background processing for the same
+spawn id is blocked. Background processing is unblocked when
+the action completes. While background processing is blocked,
+it is possible to do a (foreground)
+.B expect
+on the same spawn id.
+
+It is not possible to execute an
+.B expect
+while an
+.B expect_background
+is unblocked.
+.B expect_background
+for a particular spawn id is deleted by
+declaring a new expect_background with the same spawn id. Declaring
+.B expect_background
+with no pattern removes the given spawn id
+from the ability to match patterns in the background.
+.TP
+.BI expect_before " [expect_args]"
+takes the same arguments as
+.BR expect ,
+however it returns immediately.
+Pattern-action pairs from the most recent
+.B expect_before
+with the same spawn id are implicitly added to any following
+.B expect
+commands. If a pattern matches, it is treated as if it had been
+specified in the
+.B expect
+command itself, and the associated body is executed in the context
+of the
+.B expect
+command.
+If patterns from both
+.B expect_before
+and
+.B expect
+can match, the
+.B expect_before
+pattern is used.
+
+If no pattern is specified, the spawn id is not checked for any patterns.
+
+Unless overridden by a
+.B \-i
+flag,
+.B expect_before
+patterns match against the spawn id defined at the time that the
+.B expect_before
+command was executed (not when its pattern is matched).
+
+The \-info flag causes
+.B expect_before
+to return the current specifications of what patterns it will match.
+By default, it reports on the current spawn id. An optional spawn id specification may be given for information on that spawn id. For example
+.nf
+
+ expect_before -info -i $proc
+
+.fi
+At most one spawn id specification may be given. The flag \-indirect
+suppresses direct spawn ids that come only from indirect specifications.
+
+Instead of a spawn id specification, the flag "-all" will cause
+"-info" to report on all spawn ids.
+
+The output of the \-info flag can be reused as the argument to expect_before.
+.TP
+.BI expect_tty " [expect_args]"
+is like
+.B expect
+but it reads characters from /dev/tty (i.e. keystrokes from the user).
+By default, reading is performed in cooked mode.
+Thus, lines must end with a return in order for
+.B expect
+to see them.
+This may be changed via
+.B stty
+(see the
+.B stty
+command below).
+.TP
+.BI expect_user " [expect_args]"
+is like
+.B expect
+but it reads characters from stdin (i.e. keystrokes from the user).
+By default, reading is performed in cooked mode.
+Thus, lines must end with a return in order for
+.B expect
+to see them.
+This may be changed via
+.B stty
+(see the
+.B stty
+command below).
+.TP
+.B fork
+creates a new process. The new process is an exact copy of the current
+.B Expect
+process. On success,
+.B fork
+returns 0 to the new (child) process and returns the process ID of the child
+process to the parent process.
+On failure (invariably due to lack of resources, e.g., swap space, memory),
+.B fork
+returns \-1 to the parent process, and no child process is created.
+.IP
+Forked processes exit via the
+.B exit
+command, just like the original process.
+Forked processes are allowed to write to the log files. If you do not
+disable debugging or logging in most of the processes, the result can be
+confusing.
+.IP
+Some pty implementations may be confused by multiple readers and writers,
+even momentarily. Thus, it is safest to
+.B fork
+before spawning processes.
+.TP
+.BI interact " [string1 body1] ... [stringn [bodyn]]"
+gives control of the current process to the user, so that
+keystrokes are sent to the current process,
+and the stdout and stderr of the current process are returned.
+.IP
+String-body pairs may be specified as arguments, in which case the
+body is executed when the corresponding string is entered. (By default, the
+string is not sent to the current process.) The
+.B interpreter
+command is assumed, if the final body is missing.
+.IP
+If the arguments to the entire
+.B interact
+statement require more than one line,
+all the arguments may be "braced" into one so as to avoid terminating each
+line with a backslash. In this one case, the usual Tcl substitutions will
+occur despite the braces.
+.IP
+For example, the following command runs interact with the following
+string-body pairs defined: When ^Z is pressed,
+.B Expect
+is suspended.
+(The
+.B \-reset
+flag restores the terminal modes.)
+When ^A is pressed, the user sees "you typed a control-A" and the
+process is sent a ^A. When $ is pressed, the user sees the date.
+When ^C is pressed,
+.B Expect
+exits. If "foo" is entered, the user sees "bar".
+When ~~ is pressed, the
+.B Expect
+interpreter runs interactively.
+.nf
+
+.ta \w' interact 'u +\w'$CTRLZ 'u +\w'{'u
+ set CTRLZ \\032
+ interact {
+ -reset $CTRLZ {exec kill \-STOP [pid]}
+ \\001 {send_user "you typed a control\-A\\n";
+ send "\\001"
+ }
+ $ {send_user "The date is [clock format [clock seconds]]."}
+ \\003 exit
+ foo {send_user "bar"}
+ ~~
+ }
+
+.fi
+.IP
+In string-body pairs, strings are matched in the order they are listed
+as arguments. Strings that partially match are not sent to the
+current process in anticipation of the remainder coming. If
+characters are then entered such that there can no longer possibly be
+a match, only the part of the string will be sent to the process that cannot
+possibly begin another match. Thus, strings that are substrings of
+partial matches can match later, if the original strings that was attempting
+to be match ultimately fails.
+.IP
+By default, string matching is exact with no wild cards. (In contrast,
+the
+.B expect
+command uses glob-style patterns by default.) The
+.B \-ex
+flag may be used to protect patterns that might otherwise match
+.B interact
+flags from doing so.
+Any pattern beginning with a "-" should be protected this way. (All strings
+starting with "-" are reserved for future options.)
+
+The
+.B \-re
+flag forces the string to be interpreted as a regexp-style pattern. In this
+case, matching substrings are stored in the variable
+.I interact_out
+similarly to the way
+.B expect
+stores its output in the variable
+.BR expect_out .
+The
+.B \-indices
+flag is similarly supported.
+
+The pattern
+.B eof
+introduces an action that is
+executed upon end-of-file. A separate
+.B eof
+pattern may also follow the
+.B \-output
+flag in which case it is matched if an eof is detected while writing output.
+The default
+.B eof
+action is "return", so that
+.B interact
+simply returns upon any EOF.
+
+The pattern
+.B timeout
+introduces a timeout (in seconds) and action that is executed
+after no characters have been read for a given time.
+The
+.B timeout
+pattern applies to the most recently specified process.
+There is no default timeout.
+The special variable "timeout" (used by the
+.B expect
+command) has no affect on this timeout.
+
+For example, the following statement could be used to autologout users who have
+not typed anything for an hour but who still get frequent system
+messages:
+.nf
+
+ interact -input $user_spawn_id timeout 3600 return -output \\
+ $spawn_id
+
+.fi
+
+If the pattern is the keyword
+.BR null ,
+and nulls are allowed (via the
+.B 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.
+
+Prefacing a pattern with the flag
+.B \-iwrite
+causes the variable
+.I interact_out(spawn_id)
+to be set to the spawn_id which matched the pattern
+(or eof).
+
+Actions such as
+.B break
+and
+.B continue
+cause control structures (i.e.,
+.BR for ,
+.BR proc )
+to behave in the usual way.
+However
+.B return
+causes interact to return to its caller, while
+.B inter_return
+causes
+.B interact
+to cause a return in its caller. For example, if "proc foo" called
+.B interact
+which then executed the action
+.BR inter_return ,
+.B proc foo
+would return. (This means that if
+.B interact
+calls
+.B interpreter
+interactively typing
+.B return
+will cause the interact to continue, while
+.B inter_return
+will cause the interact to return to its caller.)
+.IP
+During
+.BR interact ,
+raw mode is used so that all characters may be passed to the current process.
+If the current process does not catch job control signals,
+it will stop if sent a stop signal (by default ^Z).
+To restart it, send a continue signal (such as by "kill \-CONT <pid>").
+If you really want to send a SIGSTOP to such a process (by ^Z),
+consider spawning csh first and then running your program.
+On the other hand, if you want to send a SIGSTOP to
+.B Expect
+itself, first call interpreter (perhaps by using an escape character), and then press ^Z.
+.IP
+String-body pairs can be used as a shorthand for avoiding having
+to enter the interpreter and execute commands interactively. The previous
+terminal mode is used while the body of a string-body pair is being executed.
+.IP
+For speed, actions execute in raw mode by default. The
+.B \-reset
+flag resets the terminal to the mode it had before
+.B interact
+was executed (invariably, cooked mode).
+Note that characters entered when the mode is being switched may be lost
+(an unfortunate feature of the terminal driver on some systems).
+The only reason to use
+.B \-reset
+is if your action
+depends on running in cooked mode.
+.IP
+The
+.B \-echo
+flag sends characters that match the following pattern back to the process
+that generated them as each character is read. This may be useful
+when the user needs to see feedback from partially typed patterns.
+.IP
+If a pattern is being echoed but eventually fails to match,
+the characters are sent to the spawned process. If the spawned
+process then echoes them, the user will see the characters twice.
+.B \-echo
+is probably only appropriate in situations where the user is
+unlikely to not complete the pattern. For example, the following
+excerpt is from rftp, the recursive-ftp script, where the user is
+prompted to enter ~g, ~p, or ~l, to get, put, or list the current
+directory recursively. These are so far away from the normal ftp
+commands, that the user is unlikely to type ~ followed by anything
+else, except mistakenly, in which case, they'll probably just ignore
+the result anyway.
+.nf
+
+ interact {
+ -echo ~g {getcurdirectory 1}
+ -echo ~l {getcurdirectory 0}
+ -echo ~p {putcurdirectory}
+ }
+
+.fi
+The
+.B \-nobuffer
+flag sends characters that match the following pattern on to
+the output process as characters are read.
+
+This is useful when you wish to let a program echo back the pattern.
+For example, the following might be used to monitor where a person is
+dialing (a Hayes-style modem). Each time "atd" is seen the script
+logs the rest of the line.
+.nf
+
+ proc lognumber {} {
+ interact -nobuffer -re "(.*)\\r" return
+ puts $log "[clock format [clock seconds]]: dialed $interact_out(1,string)"
+ }
+
+ interact -nobuffer "atd" lognumber
+
+.fi
+.IP
+During
+.BR interact ,
+previous use of
+.B log_user
+is ignored. In particular,
+.B interact
+will force its output to be logged (sent to the standard output)
+since it is presumed the user doesn't wish to interact blindly.
+.IP
+The
+.B \-o
+flag causes any following key-body pairs to be applied to the output of
+the current process.
+This can be useful, for example, when dealing with hosts that
+send unwanted characters during a telnet session.
+.IP
+By default,
+.B interact
+expects the user to be writing stdin and reading stdout of the
+.B Expect
+process
+itself.
+The
+.B \-u
+flag (for "user") makes
+.B interact
+look for the user as the process named by its argument
+(which must be a spawned id).
+.IP
+This allows two unrelated processes to be joined
+together without using an explicit loop. To aid in debugging, Expect
+diagnostics always go to stderr (or stdout for certain logging and
+debugging information). For the same reason, the
+.B interpreter
+command will read interactively from stdin.
+.IP
+For example, the following fragment creates a login process.
+Then it dials the user (not shown), and finally connects the two together.
+Of course, any process may be substituted for login.
+A shell, for example, would allow the user to work without supplying an
+account and password.
+.nf
+
+ spawn login
+ set login $spawn_id
+ spawn tip modem
+ # dial back out to user
+ # connect user to login
+ interact \-u $login
+
+.fi
+To send output to multiple processes, list each spawn id list prefaced by a
+.B \-output
+flag. Input for a group of output spawn ids may be determined
+by a spawn id list prefaced by a
+.B \-input
+flag. (Both
+.B \-input
+and
+.B \-output
+may take lists in the same form as the
+.B \-i
+flag in the
+.B expect
+command, except that any_spawn_id is not meaningful in
+.BR interact .)
+All following flags and
+strings (or patterns) apply to this input until another -input flag appears.
+If no
+.B \-input
+appears,
+.B \-output
+implies "\-input $user_spawn_id \-output".
+(Similarly, with patterns that do not have
+.BR \-input .)
+If one
+.B \-input
+is specified, it overrides $user_spawn_id. If a second
+.B \-input
+is specified,
+it overrides $spawn_id. Additional
+.B \-input
+flags may be specified.
+
+The two implied input processes default to having their outputs specified as
+$spawn_id and $user_spawn_id (in reverse).
+If a
+.B \-input
+flag appears
+with no
+.B \-output
+flag, characters from that process are discarded.
+
+The
+.B \-i
+flag introduces a replacement for the current spawn_id when no
+other
+.B \-input
+or
+.B \-output
+flags are used. A \-i flag implies a \-o flag.
+
+It is possible to change the processes that are being interacted with
+by using indirect spawn ids. (Indirect spawn ids are described in the
+section on the expect command.) Indirect spawn ids may be specified
+with the -i, -u, -input, or -output flags.
+.TP
+.B interpreter " [args]"
+causes the user to be interactively prompted for
+.B Expect
+and Tcl commands.
+The result of each command is printed.
+.IP
+Actions such as
+.B break
+and
+.B continue
+cause control structures (i.e.,
+.BR for ,
+.BR proc )
+to behave in the usual way.
+However
+.B return
+causes interpreter to return to its caller, while
+.B inter_return
+causes
+.B interpreter
+to cause a return in its caller. For example, if "proc foo" called
+.B interpreter
+which then executed the action
+.BR inter_return ,
+.B proc foo
+would return.
+Any other command causes
+.B interpreter
+to continue prompting for new commands.
+.IP
+By default, the prompt contains two integers.
+The first integer describes the depth of
+the evaluation stack (i.e., how many times Tcl_Eval has been called). The
+second integer is the Tcl history identifier. The prompt can be set by
+defining a procedure called "prompt1" whose return value becomes the next
+prompt. If a statement has open quotes, parens, braces, or brackets, a
+secondary prompt (by default "+> ") is issued upon newline. The secondary
+prompt may be set by defining a procedure called "prompt2".
+.IP
+During
+.BR interpreter ,
+cooked mode is used, even if the its caller was using raw mode.
+.IP
+If stdin is closed,
+.B interpreter
+will return unless the
+.B \-eof
+flag is used, in which case the subsequent argument is invoked.
+.TP
+.BI log_file " [args] [[\-a] file]"
+If a filename is provided,
+.B log_file
+will record a transcript of the session (beginning at that point) in the file.
+.B log_file
+will stop recording if no argument is given. Any previous log file is closed.
+
+Instead of a filename, a Tcl file identifier may be provided by using the
+.B \-open
+or
+.B \-leaveopen
+flags. This is similar to the
+.B spawn
+command. (See
+.B spawn
+for more info.)
+
+The
+.B \-a
+flag forces output to be logged that was suppressed by the
+.B log_user
+command.
+
+By default, the
+.B log_file
+command
+.I appends
+to old files rather than truncating them,
+for the convenience of being able to turn logging off and on multiple
+times in one session.
+To truncate files, use the
+.B \-noappend
+flag.
+
+The
+.B -info
+flag causes log_file to return a description of the
+most recent non-info arguments given.
+.TP
+.BI log_user " -info|0|1"
+By default, the send/expect dialogue is logged to stdout
+(and a logfile if open).
+The logging to stdout is disabled by the command "log_user 0"
+and reenabled by "log_user 1". Logging to the logfile is unchanged.
+
+The
+.B -info
+flag causes log_user to return a description of the
+most recent non-info arguments given.
+.TP
+.BI match_max " [\-d] [\-i spawn_id] [size]"
+defines the size of the buffer (in bytes) used internally by
+.BR expect .
+With no
+.I size
+argument, the current size is returned.
+.IP
+With the
+.B \-d
+flag, the default size is set. (The initial default is 2000.)
+With the
+.B \-i
+flag, the size is set for the named spawn id, otherwise it is set for
+the current process.
+.TP
+.BI overlay " [\-# spawn_id] [\-# spawn_id] [...] program [args]"
+executes
+.IR "program args"
+in place of the current
+.B Expect
+program, which terminates.
+A bare hyphen argument forces a hyphen in front of the command name as if
+it was a login shell.
+All spawn_ids are closed except for those named as arguments. These
+are mapped onto the named file identifiers.
+.IP
+Spawn_ids are mapped to file identifiers for the new program to inherit.
+For example, the following line runs chess and allows it to be
+controlled by the current process \- say, a chess master.
+.nf
+
+ overlay \-0 $spawn_id \-1 $spawn_id \-2 $spawn_id chess
+
+.fi
+This is more efficient than
+"interact \-u", however, it sacrifices the ability to do programmed
+interaction since the
+.B Expect
+process is no longer in control.
+.IP
+Note that no controlling terminal is provided. Thus, if you
+disconnect or remap standard input, programs that do
+job control (shells, login, etc) will not function properly.
+.TP
+.BI parity " [\-d] [\-i spawn_id] [value]"
+defines whether parity should be retained or stripped from the output of
+spawned processes. If
+.I value
+is zero, parity is stripped, otherwise it is not stripped.
+With no
+.I value
+argument, the current value is returned.
+.IP
+With the
+.B \-d
+flag, the default parity value is set. (The initial default is 1, i.e.,
+parity is not stripped.)
+With the
+.B \-i
+flag, the parity value is set for the named spawn id, otherwise it is set for
+the current process.
+.TP
+.BI remove_nulls " [\-d] [\-i spawn_id] [value]"
+defines whether nulls are retained or removed from the output of
+spawned processes before pattern matching
+or storing in the variable
+.I expect_out
+or
+.IR interact_out .
+If
+.I value
+is 1, nulls are removed. If
+.I value
+is 0, nulls are not removed.
+With no
+.I value
+argument, the current value is returned.
+.IP
+With the
+.B \-d
+flag, the default value is set. (The initial default is 1, i.e.,
+nulls are removed.)
+With the
+.B \-i
+flag, the value is set for the named spawn id, otherwise it is set for
+the current process.
+
+Whether or not nulls are removed,
+.B Expect
+will record null bytes to the log and stdout.
+.TP
+.BI send " [\-flags] string"
+Sends
+.IR string
+to the current process.
+For example, the command
+.nf
+
+ send "hello world\\r"
+
+.fi
+sends the characters, h e l l o <blank> w o r l d <return> to the
+current process.
+(Tcl includes a printf-like command (called
+.BR format )
+which can build arbitrarily complex strings.)
+.IP
+Characters are sent immediately although programs with line-buffered input
+will not read the characters until a return character is sent. A return
+character is denoted "\\r".
+
+The
+.B \-\-
+flag forces the next argument to be interpreted as a string rather than a flag.
+Any string can be preceded by "\-\-" whether or not it actually looks
+like a flag. This provides a reliable mechanism to specify variable strings
+without being tripped up by those that accidentally look like flags.
+(All strings starting with "-" are reserved for future options.)
+
+The
+.B \-i
+flag declares that the string be sent to the named spawn_id.
+If the spawn_id is
+.IR user_spawn_id ,
+and the terminal is in raw mode, newlines in the string are translated
+to return-newline
+sequences so that they appear as if the terminal was in cooked mode.
+The
+.B \-raw
+flag disables this translation.
+
+The
+.BR \-null
+flag sends null characters (0 bytes). By default, one null is sent.
+An integer may follow the
+.BR \-null
+to indicate how many nulls to send.
+
+The
+.B \-break
+flag generates a break condition. This only makes sense if the spawn
+id refers to a tty device opened via "spawn -open". If you have
+spawned a process such as tip, you should use tip's convention for
+generating a break.
+
+The
+.B \-s
+flag forces output to be sent "slowly", thus avoid the common situation
+where a computer outtypes an input buffer that was designed for a
+human who would never outtype the same buffer. This output is
+controlled by the value of the variable "send_slow" which takes a two
+element list. The first element is an integer that describes the
+number of bytes to send atomically. The second element is a real
+number that describes the number of seconds by which the atomic sends
+must be separated. For example, "set send_slow {10 .001}" would force
+"send \-s" to send strings with 1 millisecond in between each 10
+characters sent.
+
+The
+.B \-h
+flag forces output to be sent (somewhat) like a human actually typing.
+Human-like delays appear between the characters. (The algorithm is
+based upon a Weibull distribution, with modifications to suit this
+particular application.) This output is controlled by the value of
+the variable "send_human" which takes a five element list. The first
+two elements are average interarrival time of characters in seconds.
+The first is used by default. The second is used at word endings, to
+simulate the subtle pauses that occasionally occur at such
+transitions. The third parameter is a measure of variability where .1
+is quite variable, 1 is reasonably variable, and 10 is quite
+invariable. The extremes are 0 to infinity. The last two parameters
+are, respectively, a minimum and maximum interarrival time.
+The minimum and maximum are used last and "clip" the final time.
+The ultimate average can be quite different from the given average
+if the minimum and maximum clip enough values.
+
+As an
+example, the following command emulates a fast and
+consistent typist:
+.nf
+
+ set send_human {.1 .3 1 .05 2}
+ send \-h "I'm hungry. Let's do lunch."
+
+.fi
+while the following might be more suitable after a hangover:
+.nf
+
+ set send_human {.4 .4 .2 .5 100}
+ send \-h "Goodd party lash night!"
+
+.fi
+Note that errors are not simulated, although you can set up error
+correction situations yourself by embedding mistakes and corrections
+in a send argument.
+
+The flags for sending null characters, for sending breaks, for forcing slow
+output and for human-style output are mutually exclusive. Only the one
+specified last will be used. Furthermore, no
+.I string
+argument can be specified with the flags for sending null characters or breaks.
+
+It is a good idea to precede the first
+.B send
+to a process by an
+.BR expect .
+.B expect
+will wait for the process to start, while
+.B send
+cannot.
+In particular, if the first
+.B send
+completes before the process starts running,
+you run the risk of having your data ignored.
+In situations where interactive programs offer no initial prompt,
+you can precede
+.B send
+by a delay as in:
+.nf
+
+ # To avoid giving hackers hints on how to break in,
+ # this system does not prompt for an external password.
+ # Wait for 5 seconds for exec to complete
+ spawn telnet very.secure.gov
+ sleep 5
+ send password\\r
+
+.fi
+.B exp_send
+is an alias for
+.BI send .
+If you are using Expectk or some other variant of Expect in the Tk environment,
+.B send
+is defined by Tk for an entirely different purpose.
+.B exp_send
+is provided for compatibility between environments.
+Similar aliases are provided for other Expect's other send commands.
+.TP
+.BI send_error " [\-flags] string"
+is like
+.BR send ,
+except that the output is sent to stderr rather than the current
+process.
+.TP
+.BI send_log " [\--] string"
+is like
+.BR send ,
+except that the string is only sent to the log file (see
+.BR log_file .)
+The arguments are ignored if no log file is open.
+.TP
+.BI send_tty " [\-flags] string"
+is like
+.BR send ,
+except that the output is sent to /dev/tty rather than the current
+process.
+.TP
+.BI send_user " [\-flags] string"
+is like
+.BR send ,
+except that the output is sent to stdout rather than the current
+process.
+.TP
+.BI sleep " seconds"
+causes the script to sleep for the given number of seconds.
+Seconds may be a decimal number. Interrupts (and Tk events if you
+are using Expectk) are processed while Expect sleeps.
+.TP
+.BI spawn " [args] program [args]"
+creates a new process running
+.IR "program args" .
+Its stdin, stdout and stderr are connected to Expect,
+so that they may be read and written by other
+.B Expect
+commands.
+The connection is broken by
+.B close
+or if the process itself closes any of the file identifiers.
+.IP
+When a process is started by
+.BR spawn ,
+the variable
+.I spawn_id
+is set to a descriptor referring to that process.
+The process described by
+.I spawn_id
+is considered the
+.IR "current process" .
+.I spawn_id
+may be read or written, in effect providing job control.
+.IP
+.I user_spawn_id
+is a global variable containing a descriptor which refers to the user.
+For example, when
+.I spawn_id
+is set to this value,
+.B expect
+behaves like
+.BR expect_user .
+
+.I
+.I error_spawn_id
+is a global variable containing a descriptor which refers to the standard
+error.
+For example, when
+.I spawn_id
+is set to this value,
+.B send
+behaves like
+.BR send_error .
+.IP
+.I tty_spawn_id
+is a global variable containing a descriptor which refers to /dev/tty.
+If /dev/tty does not exist (such as in a cron, at, or batch script), then
+.I tty_spawn_id
+is not defined. This may be tested as:
+.nf
+
+ if {[info vars tty_spawn_id]} {
+ # /dev/tty exists
+ } else {
+ # /dev/tty doesn't exist
+ # probably in cron, batch, or at script
+ }
+
+.fi
+.IP
+.B spawn
+returns the UNIX process id. If no process is spawned, 0 is returned.
+The variable
+.I spawn_out(slave,name)
+is set to the name of the pty slave device.
+.IP
+By default,
+.B spawn
+echoes the command name and arguments. The
+.B \-noecho
+flag stops
+.B spawn
+from doing this.
+.IP
+The
+.B \-console
+flag causes console output to be redirected to the spawned process.
+This is not supported on all systems.
+
+Internally,
+.B spawn
+uses a pty, initialized the same way as the user's tty. This is further
+initialized so that all settings are "sane" (according to stty(1)).
+If the variable
+.I stty_init
+is defined, it is interpreted in the style of stty arguments
+as further configuration.
+For example, "set stty_init raw" will cause further spawned processes's
+terminals to start in raw mode.
+.B \-nottycopy
+skips the initialization based on the user's tty.
+.B \-nottyinit
+skips the "sane" initialization.
+.IP
+Normally,
+.B spawn
+takes little time to execute. If you notice spawn taking a
+significant amount of time, it is probably encountering ptys that are
+wedged. A number of tests are run on ptys to avoid entanglements with
+errant processes. (These take 10 seconds per wedged pty.) Running
+Expect with the
+.B \-d
+option will show if
+.B Expect
+is encountering many ptys in odd states. If you cannot kill
+the processes to which these ptys are attached, your only recourse may
+be to reboot.
+
+If
+.I program
+cannot be spawned successfully because exec(2) fails (e.g. when
+.I program
+doesn't exist), an error message will be returned by the next
+.B interact
+or
+.B expect
+command as if
+.I program
+had run and produced the error message as output.
+This behavior is a natural consequence of the implementation of
+.BR spawn .
+Internally, spawn forks, after which the spawned process has no
+way to communicate with the original
+.B Expect
+process except by communication
+via the spawn_id.
+
+The
+.B \-open
+flag causes the next argument to be interpreted as a Tcl file identifier
+(i.e., returned by
+.BR open .)
+The spawn id can then be used as if it were a spawned process. (The file
+identifier should no longer be used.)
+This lets you treat raw devices, files, and
+pipelines as spawned processes without using a pty. 0 is returned to
+indicate there is no associated process. When the connection to
+the spawned process is closed, so is the Tcl file identifier.
+The
+.B \-leaveopen
+flag is similar to
+.B \-open
+except that
+.B \-leaveopen
+causes the file identifier to be left open even after the spawn id is closed.
+
+The
+.B \-pty
+flag causes a pty to be opened but no process spawned. 0 is returned
+to indicate there is no associated process. Spawn_id is set as usual.
+
+The variable
+.I spawn_out(slave,fd)
+is set to a file identifier corresponding to the pty slave.
+It can be closed using "close -slave".
+
+The
+.B \-ignore
+flag names a signal to be ignored in the spawned process.
+Otherwise, signals get the default behavior.
+Signals are named as in the
+.B trap
+command, except that each signal requires a separate flag.
+.TP
+.BI strace " level"
+causes following statements to be printed before being executed.
+(Tcl's trace command traces variables.)
+.I level
+indicates how far down in the call stack to trace.
+For example,
+the following command runs
+.B Expect
+while tracing the first 4 levels of calls,
+but none below that.
+.nf
+
+ expect \-c "strace 4" script.exp
+
+.fi
+
+The
+.B -info
+flag causes strace to return a description of the
+most recent non-info arguments given.
+.TP
+.BI stty " args"
+changes terminal modes similarly to the external stty command.
+
+By default, the controlling terminal is accessed. Other terminals can
+be accessed by appending "< /dev/tty..." to the command. (Note that
+the arguments should not be grouped into a single argument.)
+
+Requests for status return it as the result of the command. If no status
+is requested and the controlling terminal is accessed, the previous
+status of the raw and echo attributes are returned in a form which can
+later be used by the command.
+
+For example, the arguments
+.B raw
+or
+.B \-cooked
+put the terminal into raw mode.
+The arguments
+.B \-raw
+or
+.B cooked
+put the terminal into cooked mode.
+The arguments
+.B echo
+and
+.B \-echo
+put the terminal into echo and noecho mode respectively.
+.IP
+The following example illustrates how to temporarily disable echoing.
+This could be used in otherwise-automatic
+scripts to avoid embedding passwords in them.
+(See more discussion on this under EXPECT HINTS below.)
+.nf
+
+ stty \-echo
+ send_user "Password: "
+ expect_user -re "(.*)\\n"
+ set password $expect_out(1,string)
+ stty echo
+
+.fi
+.TP
+.BI system " args"
+gives
+.I args
+to sh(1) as input,
+just as if it had been typed as a command from a terminal.
+.B Expect
+waits until the shell terminates.
+The return status from sh is handled the same way that
+.B exec
+handles its return status.
+.IP
+In contrast to
+.B exec
+which redirects stdin and stdout to the script,
+.B system
+performs no redirection
+(other than that indicated by the string itself).
+Thus, it is possible to use programs which must talk directly to /dev/tty.
+For the same reason, the results of
+.B system
+are not recorded in the log.
+.TP
+.BI timestamp " [args]"
+returns a timestamp.
+With no arguments, the number of
+seconds since the epoch is returned.
+
+The
+.B \-format
+flag introduces a string which is returned but with
+substitutions made according to the
+POSIX rules for strftime. For example %a is replaced by an abbreviated
+weekday name (i.e., Sat). Others are:
+.nf
+ %a abbreviated weekday name
+ %A full weekday name
+ %b abbreviated month name
+ %B full month name
+ %c date-time as in: Wed Oct 6 11:45:56 1993
+ %d day of the month (01-31)
+ %H hour (00-23)
+ %I hour (01-12)
+ %j day (001-366)
+ %m month (01-12)
+ %M minute (00-59)
+ %p am or pm
+ %S second (00-61)
+ %u day (1-7, Monday is first day of week)
+ %U week (00-53, first Sunday is first day of week one)
+ %V week (01-53, ISO 8601 style)
+ %w day (0-6)
+ %W week (00-53, first Monday is first day of week one)
+ %x date-time as in: Wed Oct 6 1993
+ %X time as in: 23:59:59
+ %y year (00-99)
+ %Y year as in: 1993
+ %Z timezone (or nothing if not determinable)
+ %% a bare percent sign
+
+.fi
+Other % specifications are undefined. Other characters will be passed
+through untouched. Only the C locale is supported.
+
+The
+.B \-seconds
+flag introduces a number of seconds since the epoch to be used as a source
+from which to format. Otherwise, the current time is used.
+
+The
+.B \-gmt
+flag forces timestamp output to use the GMT timezone. With no flag,
+the local timezone is used.
+.TP
+.BI trap " [[command] signals]"
+causes the given
+.I command
+to be executed upon future receipt of any of the given signals.
+The command is executed in the global scope.
+If
+.I command
+is absent, the signal action is returned.
+If
+.I command
+is the string SIG_IGN, the signals are ignored.
+If
+.I command
+is the string SIG_DFL, the signals are result to the system default.
+.I signals
+is either a single signal or a list of signals. Signals may be specified
+numerically or symbolically as per signal(3). The "SIG" prefix may be omitted.
+
+With no arguments (or the argument \-number),
+.B trap
+returns the signal number of the trap command currently being executed.
+
+The
+.B \-code
+flag uses the return code of the command in place of whatever code Tcl
+was about to return when the command originally started running.
+
+The
+.B \-interp
+flag causes the command to be evaluated using the interpreter
+active at the time the command started running
+rather than when the trap was declared.
+
+The
+.B \-name
+flag causes the
+.B trap
+command to return the signal name of the trap command currently being executed.
+
+The
+.B \-max
+flag causes the
+.B trap
+command to return the largest signal number that can be set.
+
+For example, the command "trap {send_user "Ouch!"} SIGINT" will print "Ouch!"
+each time the user presses ^C.
+
+By default, SIGINT (which can usually be generated by pressing ^C) and
+SIGTERM cause Expect to exit. This is due to the following trap, created
+by default when Expect starts.
+.nf
+
+ trap exit {SIGINT SIGTERM}
+
+.fi
+If you use the -D flag to start the debugger, SIGINT is redefined
+to start the interactive debugger. This is due to the following trap:
+.nf
+
+ trap {exp_debug 1} SIGINT
+
+.fi
+The debugger trap can be changed by setting the environment variable
+EXPECT_DEBUG_INIT to a new trap command.
+
+You can, of course, override both of these just by adding trap
+commands to your script. In particular, if you have your own "trap
+exit SIGINT", this will override the debugger trap. This is useful
+if you want to prevent users from getting to the debugger at all.
+
+If you want to define your own trap on SIGINT but still trap to the
+debugger when it is running, use:
+.nf
+
+ if {![exp_debug]} {trap mystuff SIGINT}
+
+.fi
+Alternatively, you can trap to the debugger using some other signal.
+
+.B trap
+will not let you override the action for SIGALRM as this is used internally
+to
+.BR Expect .
+The disconnect command sets SIGALRM to SIG_IGN (ignore). You can reenable
+this as long as you disable it during subsequent spawn commands.
+
+See signal(3) for more info.
+.TP
+.BI wait " [args]"
+delays until a spawned process (or
+the current process if none is named) terminates.
+.IP
+.B wait
+normally returns a list of four integers.
+The first integer is the pid of the process that was waited upon.
+The second integer is the corresponding spawn id.
+The third integer is -1 if an operating system error occurred, or 0 otherwise.
+If the third integer was 0, the fourth integer is the status returned by
+the spawned process. If the third integer was -1, the fourth integer is
+the value of errno set by the operating system. The global variable
+errorCode is also set.
+
+Additional elements may appear at the end of the return value from
+.BR wait .
+An optional fifth element identifies a class of information.
+Currently, the only possible value for this element is CHILDKILLED in
+which case the next two values are the C-style signal name and a short
+textual description.
+.IP
+The
+.B \-i
+flag declares the process to wait corresponding to the named spawn_id
+(NOT the process id).
+Inside a SIGCHLD handler,
+it is possible to wait for any spawned process by using the spawn id -1.
+
+The
+.B \-nowait
+flag causes the wait to return immediately with the indication of a
+successful wait. When the process exits (later), it will automatically
+disappear without the need for an explicit wait.
+
+The
+.B wait
+command may also be used wait for a forked process using the arguments
+"-i -1". Unlike its use with spawned processes, this command can be
+executed at any time. There is no control over which process is
+reaped. However, the return value can be checked for the process id.
+
+.SH LIBRARIES
+Expect automatically knows about two built-in libraries for Expect scripts.
+These are defined by the directories named in the variables
+exp_library and exp_exec_library. Both are meant to contain utility
+files that can be used by other scripts.
+
+exp_library contains architecture-independent files. exp_exec_library
+contains architecture-dependent files. Depending on your system, both
+directories may be totally empty. The existence of the file
+$exp_exec_library/cat-buffers describes whether your /bin/cat buffers
+by default.
+.SH PRETTY-PRINTING
+A vgrind definition is available for pretty-printing
+.B Expect
+scripts.
+Assuming the vgrind definition supplied with the
+.B Expect
+distribution is
+correctly installed, you can use it as:
+.nf
+
+ vgrind \-lexpect file
+
+.fi
+.SH EXAMPLES
+It many not be apparent how to put everything together that the man page
+describes. I encourage you to read and try out the examples in
+the example directory of the
+.B Expect
+distribution.
+Some of them are real programs. Others are simply illustrative
+of certain techniques, and of course, a couple are just quick hacks.
+The INSTALL file has a quick overview of these programs.
+.PP
+The
+.B Expect
+papers (see SEE ALSO) are also useful. While some papers
+use syntax corresponding to earlier versions of Expect, the accompanying
+rationales are still valid and go into a lot more detail than this
+man page.
+.SH CAVEATS
+Extensions may collide with Expect's command names. For example,
+.B send
+is defined by Tk for an entirely different purpose.
+For this reason, most of the
+.B Expect
+commands are also available as "exp_XXXX".
+Commands and variables beginning with "exp", "inter", "spawn",
+and "timeout" do not have aliases.
+Use the extended command names if you need this compatibility between environments.
+
+.B Expect
+takes a rather liberal view of scoping.
+In particular, variables read by commands specific to the
+.B Expect
+program will be sought first from the local scope, and if not found, in the
+global scope. For example, this
+obviates the need to place "global timeout" in every
+procedure you write that uses
+.BR expect .
+On the other hand, variables written are always in the local scope (unless
+a "global" command has been issued). The most common problem this causes
+is when spawn is executed in a procedure. Outside the procedure,
+.I spawn_id
+no longer exists, so the spawned process is no longer accessible
+simply because of scoping. Add a "global spawn_id" to such a procedure.
+
+If you cannot enable the multispawning capability
+(i.e., your system supports neither select (BSD *.*), poll (SVR>2),
+nor something equivalent),
+.B Expect
+will only be able to control a single process at a time.
+In this case, do not attempt to set
+.IR spawn_id ,
+nor should you execute processes via exec while a spawned process
+is running. Furthermore, you will not be able to
+.B expect
+from multiple processes (including the user as one) at the same time.
+
+Terminal parameters can have a big effect on scripts. For example, if
+a script is written to look for echoing, it will misbehave if echoing
+is turned off. For this reason, Expect forces sane terminal
+parameters by default. Unfortunately, this can make things unpleasant
+for other programs. As an example, the emacs shell wants to change
+the "usual" mappings: newlines get mapped to newlines instead of
+carriage-return newlines, and echoing is disabled. This allows one to
+use emacs to edit the input line. Unfortunately, Expect cannot
+possibly guess this.
+
+You can request that Expect not override its default setting of
+terminal parameters, but you must then be very careful when writing
+scripts for such environments. In the case of emacs, avoid depending
+upon things like echoing and end-of-line mappings.
+
+The commands that accepted arguments braced into a single list (the
+.B expect
+variants and
+.BR interact )
+use a heuristic to decide if the list is actually one argument or
+many. The heuristic can fail only in the case when the list actually
+does represent a single argument which has multiple embedded \\n's
+with non-whitespace characters between them. This seems sufficiently
+improbable, however the argument "\-nobrace" can be used to force a
+single argument to be handled as a single argument. This could
+conceivably be used with machine-generated Expect code. Similarly,
+-brace forces a single argument to be handle as multiple patterns/actions.
+
+.SH BUGS
+It was really tempting to name the program "sex" (for either "Smart EXec"
+or "Send-EXpect"), but good sense (or perhaps just Puritanism) prevailed.
+
+On some systems, when a shell is spawned, it complains about not being
+able to access the tty but runs anyway. This means your system has a
+mechanism for gaining the controlling tty that
+.B Expect
+doesn't know about. Please find out what it is, and send this information
+back to me.
+
+Ultrix 4.1 (at least the latest versions around here) considers
+timeouts of above 1000000 to be equivalent to 0.
+
+Digital UNIX 4.0A (and probably other versions) refuses to allocate
+ptys if you define a SIGCHLD handler. See grantpt page for more info.
+
+IRIX 6.0 does not handle pty permissions correctly so that if Expect
+attempts to allocate a pty previously used by someone else, it fails.
+Upgrade to IRIX 6.1.
+
+Telnet (verified only under SunOS 4.1.2) hangs if TERM is not set.
+This is a problem under cron, at and in cgi scripts, which do not
+define TERM. Thus, you must set it explicitly - to what type is
+usually irrelevant. It just has to be set to something! The
+following probably suffices for most cases.
+.nf
+
+ set env(TERM) vt100
+
+.fi
+
+Tip (verified only under BSDI BSD/OS 3.1 i386) hangs if SHELL and HOME
+are not set. This is a problem under cron, at and in cgi scripts,
+which do not define these environment variables. Thus, you must set
+them explicitly - to what type is usually irrelevant. It just has to
+be set to something! The following probably suffices for most cases.
+.nf
+
+ set env(SHELL) /bin/sh
+ set env(HOME) /usr/local/bin
+
+.fi
+
+
+Some implementations of ptys are designed so that the kernel throws
+away any unread output after 10 to 15 seconds (actual number is
+implementation-dependent) after the process has closed the file
+descriptor. Thus
+.B Expect
+programs such as
+.nf
+
+ spawn date
+ sleep 20
+ expect
+
+.fi
+will fail. To avoid this, invoke non-interactive programs with
+.B exec
+rather than
+.BR spawn .
+While such situations are conceivable, in practice I have never
+encountered a situation in which the final output of a truly
+interactive program would be lost due to this behavior.
+
+On the other hand, Cray UNICOS ptys throw away any unread output
+immediately after the process has closed the file descriptor. I have
+reported this to Cray and they are working on a fix.
+
+Sometimes a delay is required between a prompt and a response, such as
+when a tty interface is changing UART settings or matching baud rates
+by looking for start/stop bits. Usually, all this is require is to
+sleep for a second or two. A more robust technique is to retry until
+the hardware is ready to receive input. The following example uses
+both strategies:
+.nf
+
+ send "speed 9600\\r";
+ sleep 1
+ expect {
+ timeout {send "\\r"; exp_continue}
+ $prompt
+ }
+
+.fi
+
+trap \-code will not work with any command that sits in Tcl's event
+loop, such as sleep. The problem is that in the event loop, Tcl
+discards the return codes from async event handlers. A workaround is
+to set a flag in the trap code. Then check the flag immediately after
+the command (i.e., sleep).
+
+The expect_background command ignores -timeout arguments and has no
+concept of timeouts in general.
+
+.SH "EXPECT HINTS"
+There are a couple of things about
+.B Expect
+that may be non-intuitive.
+This section attempts to address some of these things with a couple of
+suggestions.
+
+A common expect problem is how to recognize shell prompts. Since
+these are customized differently by differently people and different
+shells, portably automating rlogin can be difficult without knowing
+the prompt. A reasonable convention is to have users store a regular
+expression describing their prompt (in particular, the end of it) in
+the environment variable EXPECT_PROMPT. Code like the following
+can be used. If EXPECT_PROMPT doesn't exist, the code still has a good chance of functioning correctly.
+.nf
+
+ set prompt "(%|#|\\\\$) $" ;# default prompt
+ catch {set prompt $env(EXPECT_PROMPT)}
+
+ expect -re $prompt
+
+.fi
+I encourage you to write
+.B expect
+patterns that include the end of whatever
+you expect to see. This avoids the possibility of answering a question
+before seeing the entire thing. In addition, while you may well be
+able to answer questions before seeing them entirely, if you answer
+early, your answer may appear echoed back in the middle of the question.
+In other words, the resulting dialogue will be correct but look scrambled.
+
+Most prompts include a space character at the end.
+For example, the prompt from ftp is 'f', 't', 'p', '>' and <blank>.
+To match this prompt, you must account for each of these characters.
+It is a common mistake not to include the blank.
+Put the blank in explicitly.
+
+If you use a pattern of the form X*, the * will match all the output
+received from the end of X to the last thing received.
+This sounds intuitive but can be somewhat confusing because the phrase
+"last thing received" can vary depending upon the speed of the computer
+and the processing of I/O both by the kernel and the device driver.
+.PP
+In particular, humans tend to see program output arriving in huge chunks
+(atomically) when in reality most programs produce output one
+line at a time. Assuming this is the case, the * in the pattern of the
+previous paragraph may only match the end of the current line even though
+there seems to be more, because at the time of the match that was all
+the output that had been received.
+.PP
+.B expect
+has no way of knowing that further output is coming unless your
+pattern specifically accounts for it.
+.PP
+Even depending on line-oriented buffering is unwise. Not only do programs
+rarely make promises about the type of buffering they do, but system
+indigestion can break output lines up so that lines break at seemingly
+random places. Thus, if you can express the last few characters
+of a prompt when writing patterns, it is wise to do so.
+
+If you are waiting for a pattern in the last output of a program
+and the program emits something else instead, you will not be able to
+detect that with the
+.B timeout
+keyword. The reason is that
+.B expect
+will not timeout \- instead it will get an
+.B eof
+indication.
+Use that instead. Even better, use both. That way if that line
+is ever moved around, you won't have to edit the line itself.
+
+Newlines are usually converted to carriage return, linefeed sequences
+when output by the terminal driver. Thus, if you want a pattern that
+explicitly matches the two lines, from, say, printf("foo\\nbar"),
+you should use the pattern "foo\\r\\nbar".
+.PP
+A similar translation occurs when reading from the user, via
+.BR expect_user .
+In this case, when you press return, it will be
+translated to a newline. If
+.B Expect
+then passes that to a program
+which sets its terminal to raw mode (like telnet), there is going to
+be a problem, as the program expects a true return. (Some programs
+are actually forgiving in that they will automatically translate
+newlines to returns, but most don't.) Unfortunately, there is no way to find
+out that a program put its terminal into raw mode.
+.PP
+Rather than manually replacing newlines with returns, the solution is to
+use the command "stty raw", which will stop the translation.
+Note, however, that this means that you will no longer get the cooked
+line-editing features.
+.PP
+.B interact
+implicitly sets your terminal to raw mode so this problem will not arise then.
+
+It is often useful to store passwords (or other private information)
+in
+.B Expect
+scripts. This is not recommended since anything that is
+stored on a computer is susceptible to being accessed by anyone.
+Thus, interactively prompting for passwords from a script is a smarter
+idea than embedding them literally. Nonetheless, sometimes such embedding
+is the only possibility.
+.PP
+Unfortunately, the UNIX file system has no direct way of creating
+scripts which are executable but unreadable. Systems which support
+setgid shell scripts may indirectly simulate this as follows:
+.PP
+Create the
+.B Expect
+script (that contains the secret data) as usual.
+Make its permissions be 750 (\-rwxr\-x\-\-\-) and owned by a trusted group,
+i.e., a group which is allowed to read it. If necessary, create a new
+group for this purpose. Next, create a /bin/sh script with
+permissions 2751 (\-rwxr\-s\-\-x) owned by the same group as before.
+.PP
+The result is a script which may be executed (and read) by anyone.
+When invoked, it runs the
+.B Expect
+script.
+.SH "SEE ALSO"
+.BR Tcl (3),
+.BR libexpect (3)
+.br
+.I
+"Exploring Expect: A Tcl-Based Toolkit for Automating Interactive Programs"
+\fRby Don Libes, pp. 602, ISBN 1-56592-090-2, O'Reilly and Associates, 1995.
+.br
+.I
+"expect: Curing Those Uncontrollable Fits of Interactivity" \fRby Don Libes,
+Proceedings of the Summer 1990 USENIX Conference,
+Anaheim, California, June 11-15, 1990.
+.br
+.I
+"Using
+.B expect
+to Automate System Administration Tasks" \fRby Don Libes,
+Proceedings of the 1990 USENIX Large Installation Systems Administration
+Conference, Colorado Springs, Colorado, October 17-19, 1990.
+.br
+.I
+"Tcl: An Embeddable Command Language" \fRby John Ousterhout,
+Proceedings of the Winter 1990 USENIX Conference,
+Washington, D.C., January 22-26, 1990.
+.br
+.I
+"expect: Scripts for Controlling Interactive Programs" \fRby Don Libes,
+Computing Systems, Vol. 4, No. 2, University of California Press Journals,
+November 1991.
+.br
+.I
+"Regression Testing and Conformance Testing Interactive Programs", \fRby Don
+Libes, Proceedings of the Summer 1992 USENIX Conference, pp. 135-144,
+San Antonio, TX, June 12-15, 1992.
+.br
+.I
+"Kibitz \- Connecting Multiple Interactive Programs Together", \fRby Don Libes,
+Software \- Practice & Experience, John Wiley & Sons, West Sussex, England,
+Vol. 23, No. 5, May, 1993.
+.br
+.I
+"A Debugger for Tcl Applications", \fRby Don Libes,
+Proceedings of the 1993 Tcl/Tk Workshop, Berkeley, CA, June 10-11, 1993.
+.SH AUTHOR
+Don Libes, National Institute of Standards and Technology
+.SH ACKNOWLEDGMENTS
+Thanks to John Ousterhout for Tcl, and Scott Paisley for inspiration.
+Thanks to Rob Savoye for Expect's autoconfiguration code.
+.PP
+The HISTORY file documents much of the evolution of
+.BR expect .
+It makes interesting reading and might give you further insight to this
+software. Thanks to the people mentioned in it who sent me bug fixes
+and gave other assistance.
+.PP
+Design and implementation of
+.B Expect
+was paid for in part by the U.S. government and is therefore in the public
+domain.
+However the author and NIST would like credit
+if this program and documentation or portions of them are used.