Sending Characters While Pattern Matching

By default, characters are not sent to the spawned process until either a match is made or no match is possible. Characters that may potentially match are buffered. It is occasionally useful to disable this buffering.

The buffering is disabled using the -nobuffer flag. Using this flag, all characters are sent to the spawned process whether or not they match, do not match, or might match in the future.

For example, a site had a modem that was available to all users. The site administrators wanted to monitor the phone numbers being dialed. Using tip or some other interactive program, there was no way of recording the numbers. They used the following fragment in a script that ran on top of tip.

proc lognumber {} {
    interact -nobuffer -re "(.*)\r" return
    puts $log "[exec date]: dialed $interact_out(1,string)"
}
interact -nobuffer "\ratd" lognumber

The interact command (see last line) passes all characters to the spawned process. If the user presses return followed by atd, the lognumber procedure is invoked. The return forces the command to be entered at the beginning of a line—just one more safeguard against detecting the pattern at the wrong time.

Unlike the example on page 335, lognumber records everything until another return is pressed. The characters between the first \ratd and the next \r are the phone number. Because of the -nobuffer on the second interact command, the phone number is sent to the spawned process and echoed normally. The user ...

Get Exploring Expect now with the O’Reilly learning platform.

O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.