Сохранить вывод терминала в переменную в ожидаемом /tcl
Привет всем, я должен использовать интерактивную программу, и я хочу автоматизировать ее с ожидаемым. Мой опыт работы с Linux и сценариями не самый лучший. Итак, это вывод программы:
enter minimum cross-correlation threshold: 0.15
enter the range and azimuth error thresholds: 1.6 1.0
range, azimuth error thresholds: 1.60000 1.00000
cross-correlation threshold: 0.15000
*
*
*
model fit std. dev. (samples) range: 0.5298 azimuth: 0.4166
set new error bounds? (0: no, 1: yes): 0
Первые две строки и последняя являются интерактивными. Таким образом, при ожидании и отправке было не сложно ввести пороговые значения за один раз. Но я хочу повторить этот процесс. Поэтому я должен сохранить результаты "диапазон: азимут 0,5298: 0,4166" в две переменные и затем запускать снова, пока я не получу хорошие результаты, например "диапазон: 0,02 азимут: 0,02".
У кого-нибудь есть идея, как я могу сохранить результаты, сравнить их и повторить процесс?
Это работает:
#!/usr/bin/expect
spawn ./offset_fitm_exp
expect "enter minimum cross-correlation threshold:" { send "0.15\r" }
expect "enter the range and azimuth error thresholds:" { send "1.6 1.0\r" }
expect "set new error bounds? (0: no, 1: yes):" { send "0\r" }
interact
Спасибо за вашу помощь! Бьорн
2 ответа
Чтобы автоматизировать итерацию, вы можете сделать это:
#!/usr/bin/expect
spawn ./offset_fitm_exp
set range 1.6
set azimuth 1.0
while {true} {
expect "enter minimum cross-correlation threshold:"
send "0.15\r"
expect "enter the range and azimuth error thresholds:"
send "$range $azimuth\r"
expect -re {range: ([0-9.]+) azimuth: ([0-9.]+} {
set range $expect_out(1,string)
set azimuth $expect_out(2,string)
}
expect "set new error bounds? (0: no, 1: yes):" {
if {$range > 0.02 || $azimuth > 0.02} {
send "1\r"
} else {
send "0\r"
break
}
}
}
interact
Хорошо, я думаю, но я мог бы заняться и забыть, или проследить за собой. так что вы можете попробовать обработать строки вывода как строки, которые имеют фиксированные столбцы (надеюсь, что так), и установить вывод, вы можете сделать:
set A1 [lrange $expect_out(1,string) 2]
set A2 [lrange $expect_out(1,string) 3]
затем сделайте что-то вроде:
if {$A1>=N || $A2>=N} do something (like change the set a1,a2 values, or ....
Я проверю позже.