Salva saída de terminal para variável em espera / tcl

0

Hej tudo, Eu tenho que usar um programa interativo e quero automatizá-lo com expectativa. Minhas experiências em Linux e scripts não são as melhores. Então esta é a saída do programa:

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

As duas primeiras linhas e a última são interativas. Então, com esperar e enviar, não foi um problema entrar nos limites por uma vez. Mas eu quero repetir este processo. Portanto, eu tenho que salvar os resultados "range: 0.5298 azimuth: 0.4166" em duas variáveis e, em seguida, executar novamente até obter bons resultados, por exemplo. "intervalo: 0,02 azimute: 0,02".

Alguém tem uma ideia de como posso armazenar os resultados, compará-los e repetir o processo?

Isso funciona:

#!/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

Obrigado pela sua ajuda! Bjoern

    
por Piotr De 02.02.2016 / 15:44

2 respostas

0

Para automatizar a iteração, você pode fazer isso:

#!/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
    
por glenn jackman 02.02.2016 / 18:01
0

Ok, estou pensando, mas posso ficar ocupado e esquecer, ou acompanhar. então você pode tentar processar as linhas de saída como linhas que possuem colunas fixas (espero que seja o caso) para combinar e definir a saída, você poderia fazer:

set A1 [lrange $expect_out(1,string) 2]
set A2 [lrange $expect_out(1,string) 3]

faça algo como:

if {$A1>=N || $A2>=N} do something (like change the set a1,a2 values, or ....

Vou voltar mais tarde.

    
por j0h 02.02.2016 / 16:30