come pulire il precedente expect_buf in uno script expect

Ho scritto aspettare funzione per ottenere l’output di un comando e il mio codice è come di seguito

proc do_cmd {cmd id} {
  set spawn_id $id
  send "$cmd\r"
  expect "$cmd\r"
  expect {
    -re "\n(.*)\r\n" {return $expect_out(1,string)}
    default {exit 1}
  }
}

Se chiamo la funzione solo una volta che sarebbe funziona bene il ritorno di qualcosa che io voglio, ma se mi chiamano in continuazione senza una pausa, avrebbe restituito qualcosa di indesiderato.

# test case 1
set ret [do_cmd $mycmd $spawn_id]
puts "$mycmd returns $ret"  # the return value is ok

# test case 2
set ret [do_cmd $mycmd $spawn_id]
set ret [do_cmd $mycmd $spawn_id]
puts "$mycmd returns $ret"  # the return value is not something I want

Io uso il ‘exp_internal 1’ a di debug e ho trovato che il expect_out nella seconda denominata comando detiene ancora la precedente uscita info e causato la corrispondenza del problema, così come posso pulire il expect_out buffer(ho provato a impostare una stringa vuota, ma non funziona,) o c’è qualcos’altro che posso fare per evitare questo problema? Grazie in anticipo.

Non hai bisogno di -re "\n(.*)\r\n" per corrispondenza per l’espressione regolare ? perché si sta utilizzando expect_out(1,string)
Ops, errore mio, grazie per ricordarmi che

OriginaleL’autore user1726366 | 2014-08-27

One Reply
  1. 10

    Non Libes suggerimento per il tuo scenario è il seguente,

    A volte è anche utile dire:

    expect *

    Qui l’ * corrisponde a nulla. Questo è come dire: “non mi importa cosa
    nel buffer di input. Buttare via.” Questo modello corrisponde sempre, anche
    se lì non c’è niente. Ricordate che * corrisponde a nulla, e il vuoto
    stringa è nulla!!! Come corollario di questo comportamento, questo comando
    sempre restituisce immediatamente. Mai, in attesa di nuovi dati per arrivare. Si
    non è necessario dal momento che si abbina a tutto.

    Di riferimento : Esplorare Aspettiamo

    In questo caso, dopo la tua richiesta partita, meglio provare a salvare il risultato di alcune variabili, quindi semplicemente aggiungere il codice expect * all’ultimo. Questo è in grado di svuotare il buffer. Il codice modificato come di seguito.

    proc do_cmd {cmd id} {
      set spawn_id $id
      send "$cmd\r"
      #Looks like you are looking for a particular command to arrive
      expect "$cmd\r"
      #Then you have one more expect here which is you want to get it
      expect {
        #Saving the value sub match to the variable 'result'
        -re "\n(.*)\r\n" {set result $expect_out(1,string)}}
        }
      #Causing the buffer to clear and it will return quickly
      expect *
      return $result
    }

    A parte questo, c’è un altro modo è possibile disabilitare i expect_out(buffer) contenuto stesso, che elimina l’ ‘tampone’ indice da expect_out matrice che può essere raffigurato come

    unset expect_out(buffer)

    Quando la prossima partita succede, expect_out array verrà aggiornato l’indice di ‘buffer’ e possiamo fresca expect_out(buffer) valore. Sostituire il expect * con il codice di cui sopra, se si preferisce utilizzare in questo modo.

    Questo è piuttosto una soluzione tipo di cose per ottenere ciò che vogliamo realmente. Si può andare avanti con qualsiasi approccio. La scelta è vostra. 🙂

    la soluzione è ottima, grazie per il vostro aiuto 🙂
    Ho determinato empiricamente che disabilitare i expect_out(buffer) è molto più coerente di “aspettare *”. Questo post è stato di grande aiuto per me. Stackoverflow è indispensabile come sempre.

    OriginaleL’autore Dinesh

Lascia un commento