Как сделать, чтобы ожидаемая команда ожидала сбой, если выходные данные не совпадали? - PullRequest
0 голосов
/ 03 октября 2019

Учитывая очень простой сценарий script.expect

#!/usr/bin/expect

spawn bash
expect "#"
send "/bin/false; echo \"process returned with $?\"\r"
expect -exact "process returned with 0"
send -- "exit\r"
expect eof

Кажется, я не могу понять, как сценарий не может выйти из строя, поскольку /bin/false заставит команду echo напечатать process returned with 1таким образом, process returned with 0 никогда не может быть сопоставлено с командой expect. Я ожидаю, что expect script.expect потерпит неудачу с кодом возврата 1 после expect -exact "process returned with 0".

#!/usr/bin/expect

spawn bash
expect "#"
send "/bin/true; echo \"process returned with $?\"\r"
expect -exact "process returned with 0" {
  send -- "exit\r"
  expect eof
  exit 0
}
exit 1

Даже если я изменю логику своего «приложения», чтобы иметь возможность проверить его с положительным / логически отрицательнымпоток результатов по-прежнему необъясним.

Я работал через

и понятия не имею, почему expect ведет себя таким образом.

1 Ответ

3 голосов
/ 03 октября 2019

В вашем первом скрипте команда expect -exact... "успешно" с таймаутом . Время ожидания по умолчанию составляет 10 секунд, а действие по умолчанию - ничего не делать. Таким образом, команды ждут 10 секунд, соответствуют тайм-ауту и ​​возвращаются, поэтому мы продолжаем со следующей командой.

Вы можете явно указать время ожидания:

expect {
    -exact "process returned with 0" {}
    timeout { puts "timeout!"; exit 1 }
}

Чтобы избежать ожидания по тайм-ауту,Вы можете использовать регулярное выражение, которое будет соответствовать $? 0 или 1 (или другим числам). Если вы поместите часть регулярного выражения в группу захвата (), вы сможете найти его во встроенной переменной $expect_out(1,string):

expect -re {process returned with ([0-9]+)}
set returncode $expect_out(1,string)
puts "we got $returncode"
exit $returncode

Обратите внимание, регулярное выражение использует кавычки в стиле {}, поскольку"" кавычки не позволяют использовать [] внутри них.

...