как работает $expect out в TCL / EXPECT?

Если я хочу соответствовать DEF_23 используя следующее регулярное выражение:

expect {
    -re "DEF_[0-9]*"
    set result $expect_out(1,string)
}

почему в массиве нет такого элемента? как работает этот $ expect_out? и если я хочу назначить результат как DEF, Как получить DEF с помощью regexp и назначить переменному результату?

3 ответов


вы ищете expect_out(0,string) -- элемент массива 1,string будет заполнено, если у вас есть захват скобок в регулярном выражении.

на ожидать manpage документы использование expect_out в документации ожидал:

при сопоставлении шаблона (или eof или full_buffer) любой соответствующий и ранее непревзойденный вывод сохраняется в переменной expect_out(буфер). Вверх до 9 совпадений подстроки regexp сохраняются в переменных expect_out(1,строка) через expect_out(9,строка). Если -индексов флаг используется перед шаблоном, начальным и конечным индексами (в форме, подходящей для lrange) из 10 строк хранятся в переменных expect_out (X,start) и expect_out (X,end) где X-цифра, соответствует позиции подстроки в буфере. 0 относится к строки, которые соответствуют всему шаблону и генерируются для шаблонов glob, а также шаблонов regexp.

в manpage есть иллюстративный пример.


Кажется, что приведенное выше объяснение не является точным! Проверьте этот пример:

$ cat test.exp
#!/usr/bin/expect

set timeout 5
log_user 0

spawn bash

send "ls -1 db*\r"
expect {
  -re "^db.*$" {
    set bkpfile $expect_out(0,string)
  }
}

send_user "The filename is: $bkpfile\n"

close
$ ls -1 db*
dbupgrade.log
$ ./test.exp
can't read "bkpfile": no such variable
    while executing
"send_user "The filename is: $bkpfile\n""
    (file "./test.exp" line 15)
$

результат теста тот же,когда используется $expect_out(1, string) или $expect_out(buffer). Я что-то упускаю или это ожидаемое поведение?


Aleksandar-он должен работать, если вы измените матч на " \ndb.*$".

Если вы включите exp_internal 1, вы увидите, что буфер содержит что-то вроде этого: "ls -1 db*\r\ndbupgrade.log\r\n08: 46: 09"

Итак, каретка ( ^ ) сбросит ваш шаблон.