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.