2016-06-13 20 views
1

Ich habe ein Perl-Skript, das ein anderes Programm mit Backticks aufruft, und prüft die Ausgabe für bestimmte Zeichenfolgen. Das läuft gut.Perl-Skript Interaktion mit STDIN eines anderen Programms

Das Problem, das ich habe, ist, wenn das andere Programm bei dem, was es tut, scheitert und auf Benutzereingaben wartet. Der Benutzer muss zweimal die Eingabetaste drücken, bevor er das Programm beendet.

Wie kann ich meinem Perl-Skript mitteilen, zweimal auf dieses Programm zu drücken?

+2

http://search.cpan.org/~rgiersig/Expect-1.15/Expect.pod – xxfelixxx

Antwort

3

Der gestartete Befehl die gleiche STDIN und STDERR von Ihrem Skript empfängt, nur STDOUT an das Skript geleitet wird.

Sie könnten einfach Ihre STDIN schließen, bevor Sie den Befehl ausführen, und es wird keine Eingabequelle geben. Lesen von STDIN wird einen Fehler verursachen und die gerufene Befehl beendet:

close STDIN; 
my @slines = `$command`; 

Dies wird auch ungültig jede Chance auf Konsole Eingang zu Ihrem Script.

Ein anderer Ansatz wäre verwenden IPC::Open2, die Ihr Skript ermöglicht STDIN und STDOUT des Befehls zur gleichen Zeit zu kontrollieren:

use IPC::Open2; 
open2($chld_in, $chld_in, 'some cmd and args'); 
print $chld_in "\n\n"; 
close $chld_in; 
@slines = <$chld_out>; 
close $chld_out; 

Dieses Skript des zwei \n Eingang bietet durch den Befehl benötigt und liest die Befehlsausgabe.

+0

Ich fand, dass die Verwendung von 'close STDIN' es mir nicht erlaubte, die volle Ausgabe des laufenden Programms zu erfassen. Ich nehme an, es gibt einen Tippfehler in Ihrem Code - es sollte 'open2 ($ chld_out, $ chld_in, 'einige cmd und args');'? Allerdings habe ich immer noch das gleiche Problem - ich lese, dass es sein würde, weil ich unter Windows laufe? –

+0

Ich schaffte es, das zu erreichen, indem ich zwei Zeilen nach der Zeile open2 hinzufügte: 'sleep (10); print $ chld_in; '- Ich gehe davon aus, dass es an das Kind gesendet hat, bevor es bereit war, das \ n \ n zu akzeptieren, und ich fand anderswo, dass print $ chld_in auf Windows-Systemen hilft. Danke @Sebastian, dass du mich in die richtige Richtung gelenkt hast –

2

Sie könnten nur Pfeife sie in:

echo "\n\n" | yourcommand 
+0

Meine aktuellen Code sieht wie folgt aus: meine @slines = '" $ command'; Wäre es dann geworden: meine @slines = echo "\ n \ n" | '" $ Befehl "; ? –