2012-04-09 11 views
4

Ich möchte wissen, wie man den expect-Befehl im expect-Skript auf den exakten String wartet, bevor man zur nächsten Zeile im Skript übergeht.Wie erwarte ich einen Befehl im Expect-Programmskript, um auf den exakten String zu warten

Bourne-Shell (SH) Script:

#!/bin/sh 
#!/usr/bin/expect 

spawn ssh -Y [email protected] 
expect -exact "[email protected]'s password: " 

# replace password with ur own passwd 
send "geomax45\r" 

# replace the prompt with ur own prompt 
expect "[email protected]:~$ " 

# run application 
send "./sample\r" 

expect "*Menu*\r 
1. print hello world\r 
2. print Bye world\r 
3. quit\r 
enter choice: " 
# enter choice 1 
send "1\r" 
expect "Bye world\r 
*Menu*\r 
1. print hello world\r 
2. print Bye world\r 
3. quit\r 
enter choice: $" 
# enter choice 2 
send "2\r" 

In dem obigen Code nach Eingabe des Codes 1 sollte für "Bye Welt \ r ......" wait Zeichenfolge auf dem Bildschirm auftreten, . Aber obwohl der Bildschirm eine andere Zeichenkette anfordert, führt der Code die nächste Zeile aus und gibt Option 2 ein, die nicht gemäß der Definition von expect auftreten sollte. Es sollte warten, bis die vollständige Zeichenfolge im Befehl expect übereinstimmt.

Ich möchte wissen, ob es einen strengeren Befehl gibt, der verwendet werden kann, so dass expect wartet, bis der exakte String-Matching erfolgt. Bitte helfen Sie mir in dieser Ausgabe

+1

füge 'exp_internal 1' zu deinem Skript hinzu - das wird zeigen, dass du jetzt erwartest, dass die Übereinstimmung erreicht wird, und du wirst sehen können, warum das Match erfolgreich ist. –

Antwort

3

Sie verwenden es bereits früher in Ihrem Skript: expect -exact. Aber lange übereinstimmende Saiten sind ziemlich garantiert, um Probleme zu verursachen; Sie sollten versuchen, sie auf die kürzeste eindeutige Übereinstimmung zu reduzieren, wenn nötig, indem Sie sie in mehrere expect Befehle aufteilen.

In diesem Fall, nur basierend auf dem, was Sie zeigen, ist der richtige Befehl wahrscheinlich expect -exact "choice:". Aber von Natur aus ist es nicht möglich, dies ohne vollständige Details der möglichen Programmausgaben zu bestimmen.

+0

Ich habe versucht, mit expect - execute "" Befehl, aber immer noch die Erwarte ist erlaubt, den nächsten Befehl ohne genaue String-Matching in vor Schritt ausgeführt. – chaitu

+0

Versuchen Sie immer noch, die gesamte mehrzeilige Zeichenfolge zu finden? Wie gesagt, das wird nicht funktionieren (siehe 'match_max' und die Diskussion über" Systemverdauung ") in der' expect'-Manpage. Sie sollten wahrscheinlich auch nach Timeout suchen. – geekosaur