Ожидать - получение переменной из области экрана на основе строки и столбца
-
22-09-2019 - |
Вопрос
Я автоматически взаимодействую с сеансом SSH и ERP-программой, используя Expect.
Вместо того, чтобы полагаться на регулярное выражение для захвата переменной в моем ожидаемом сценарии, было бы возможно после получения определенного нажатия клавиши от пользователя преобразовать область экрана, скажем, одно поле, в переменную в коде?Отправить серверу какие-то другие команды и повторно отправить поле?
Допустим, номер заказа содержится в 6, 12, 6, 18 (где 6 - строка, а 12-18 - столбцы), содержащий мой 6-значный номер заказа.Я хочу получить этот номер заказа из столбцов строки 6 с 12 по 18, скопировав его в переменную.Затем разрешите пользователю еще немного поработать (или ожидать перехода в другое меню), затем повторно отправьте номер заказа в другом меню.
Итак, я предполагаю, что мой вопрос заключается в следующем:Находится ли содержимое текущего экрана в одном буфере?(не весь сеанс) Можете ли вы извлечь только определенный элемент данных, который существовал бы только в этом диапазоне строк и столбцов на экране?
Пример псевдокода:
#!/usr/bin/expect -f
set env(TERM) vt100
spawn ssh -Y user@domain
#... set user/pass and other vars...
#... send commands to log into ERP
#don't time out
set timeout -1
interact {
-reset $CTRLZ {exec kill -STOP [pid]}
$CTRLA {
exp_send "menu_address\ry\r"
}
$CTRLO {
#...acquire order number variable...
#...some code I don't understand yet...
exp_send "menu_exit_sequence\r"
exp_send "menu_address\r"
exp_send $ordernumvar
}
~~
}
Решение
Нет, вы не можете захватить что-то с экрана в определенной строке / столбце.Однако подумайте о том, как информация вообще попала на экран.Если это приложение на основе tty, использующее curses, оно было выведено в стандартный вывод со специальными escape-последовательностями, которые привели к его появлению в этой строке / столбце.Итак, "ожидайте", что эти конкретные escape-последовательности получат то, что находится в этой позиции.
Другие советы
На самом деле термин_экспектировать пример программы, которая поставляется с Expect, может сделать именно это.Он эмулирует терминал, адресуемый курсору, и позволяет вам тестировать вывод в определенных местах экрана.В моем дистрибутиве ActiveTcl он находится в demos / Expect /term_expect .
Для отладки выходных данных моей ERP-системы я обнаружил, что могу использовать эксп_интернал чтобы получить выходные символы.
exp_internal -f file 0
Результат этого дал мне:(мой введенный номер - 076338)
spawn id exp0 sent <0>^M
spawn id exp6 sent <0>^M
spawn id exp0 sent <7>^M
spawn id exp6 sent <7>^M
spawn id exp0 sent <6>^M
spawn id exp6 sent <6>^M
spawn id exp0 sent <3>^M
spawn id exp6 sent <3>^M
spawn id exp0 sent <3>^M
spawn id exp6 sent <3>^M
spawn id exp0 sent <8>^M
spawn id exp6 sent <8>^M
spawn id exp0 sent <\r>^M
spawn id exp6 sent <\r\n\u001b[1;14H>^M
Итак, теперь мне нужно вычислить регулярное выражение, чтобы получить поле.У меня было это:
-nobuffer -re {^([a-zA-Z0-9]{1})?[0-9]{5}$} {
set ordernumber $interact_out(0,string)
}
но теперь мне нужно включить это:
^([a-zA-Z0-9]{1})?[0-9]{5}
С некоторым регулярным выражением, которое представляло бы это:
\r\n\u001b[1;14H
И затем, как только я сохраню это в переменной $ordernumber, мне нужно каким-то образом изолировать только символы, предшествующие завершающей строке, и сохранить их в переменной.