More Detail On Matching

If two or more patterns can match the same output, only one action will be executed. The action corresponds to the pattern that appears first in the command. This is just the way the expect command works. Here is an example that has both an exact pattern and a regular expression. When abc is entered, action1 is executed while action2 is executed if axc is entered. If the patterns were reversed, the exact pattern would never match since the regular expression would always match first.

interact {
    "abc" action1
    -re "a.c" action2
}

Pattern matching works differently in one respect between expect and interact. The expect command attempts to match a pattern beginning at every place in the input. Only after failing to match anywhere will expect try another pattern. In contrast, if interact fails to match a pattern starting from a particular place in the input, it then tries the next pattern beginning at the same place in the input.

The difference is only noticeable in a situation where two or more patterns can match in the input. This does not normally occur in user input but can be common when making substitutions in spawned process output, such as when using -o. Earlier I showed an example of -o. Here it is again:

interact {
    -o
    "unix" {send_user "eunuchs"}
    "vms"  {send_user "vmess"}
    "dos"  {send_user "dog"}
}

Now consider what happens when a spawned process produces the following output:

This software runs on both vms and unix.

Both unix and vms appear in the output ...

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.