2017-03-01 3 views
0

Ich arbeite an erwarten, dass Skript einen Installer aufrufen. Sh Für eine ordentliche Installation, es funktioniert gut.Expect Script - variierende sendet

Aber wenn der Installer für Pre-Checks fehlschlägt, unterscheidet sich die Reihenfolge des Sendens und ich habe keine Kontrolle über die Bestellung.

Nach 2 erwarten "Pfad", validiert das Installationsprogramm intern und geht mit Schritt 3 und weiter und endet.

Aber wenn nach dem zweiten Pfad erwarten, fehlschlägt Installer Pre-Checks dann existiert es und fordert zum letzten Schritt, dh für den Pfad erneut.

Derzeit, wenn das Skript nach dem Beenden angezeigt wird und zur Eingabe von 4 auffordert, sendet es weiterhin die dritte Antwort, die irrelevant ist. Prüft das Skript nicht die Übereinstimmung erwartet Zeichenfolge?

Error : 
    "No Space. Exiting. 
    **Path: 1** 
    cp: cannot create regular file `1': Permission denied 
    send: spawn id exp5 not open 
     while executing 
    "send "path\r"" 

Das Shell-Skript wird aus verschiedenen Gründen beendet und zum letzten Senden aufgefordert.

Gibt es eine Möglichkeit, die letzte Display-Nachricht expect_out während der Sitzung zu erhalten und sie zu lesen und basierend darauf fortzusetzen.

spawn shellscript 
expect_1 
send_1 
expect_2 
send_2 
--sh stops and displays exiting... 
if expect_out(buffer)=exiting 
then 
expect_4 
send_4 
else 
expect_3 
send_3 
expect_4 
send_4 
exit 
+0

Vielleicht mit "fangen" arbeiten? – unNamed

+0

Ich würde darüber nachdenken, den 'expect_before' Befehl zu verwenden, um eine" Error "Nachricht zu sehen. –

Antwort

1

Der Schlüssel, was Sie wahrscheinlich benötigen, ist die Fähigkeit, expect verschiedene Dinge auf einmal. Glücklicherweise ist das ziemlich einfach.

expect { 
    "change? (Y/N)" { 
     # Something in here to respond to this case 
     # This bit is just code, but could be effectively empty too 
    } 
    "Exiting" { 
     # Now we've detected that the installer failed 
     send_user "oh no!\n" 
     exit 1 
    } 
} 

Wenn Sie dieses Formular verwenden, können Sie die aktuellen expect aus einem Handler-Skript neu starten, indem Sie es mit exp_continue beenden. Wie immer müssen Sie sorgfältig darüber nachdenken, welche Muster tatsächlich übereinstimmen.

+0

danke versuchen. 'Expect: tut" \ r \ nY \ r \ n \ r \ nBitte geben Sie den Pfad ein: "(spawn_id exp5) exakte Zeichenfolge" Bitte geben Sie den Pfad $ "ein? nein expect: does "\ r \ nY \ r \ n \ r \ nBitte geben Sie den Pfad ein: \ r \ n" (spawn_id exp5) Entspricht der exakten Zeichenfolge "Bitte geben Sie den Pfad $" ein? nein erwartet: Zeitüberschreitung senden: senden "/ proj/XXX/YYYY \ r" zu {exp5} erwarten: tut "\ r \ nY \ r \ n \ r \ nBitte geben Sie Pfad: \ r \ n" (spawn_id exp5) match glob pattern "Exiting"? nein /proj/XXX/YYYY' expected hängt vorhergehende Zeilen rekursiv an. Ich habe versucht, mehrere Regex, aber jedes Mal Timeout auftritt. – Unixnewbie