2016-09-30 5 views
2

Ich möchte ein einfaches Automatisierungstool in Ruby schreiben, das ein Befehlszeilenprogramm umbrechen soll.Wie schreibe ich ein Programm, das sowohl STDOUT als auch STDIN eines anderen Programms umschließt?

Das Befehlszeilenprogramm funktioniert in etwa wie eine REPL: Befehle können über STDIN eingegeben werden und die Ausgabe wird an STDOUT zurückgegeben. Das Ruby-Tool muss daher in der Lage sein, Eingaben aus dem STDOUT des Programms zu lesen und neue Befehle an die Programme STDIN zurückzugeben.

Wie kann ein solcher zyklischer Ein-/Ausgang eingerichtet werden? Ich bin mir nicht ganz sicher, ob diese Frage zu Ruby gehört oder ob es mehr damit zusammenhängt, wie Streams in Unix-Systemen im Allgemeinen verbunden werden können.

+0

Bitte lesen Sie "[fragen]". Sie bitten uns, Ihnen zu erklären, wie Sie etwas tun sollten, das Sie hätten recherchieren sollen, und dann haben Sie versucht, Code zu schreiben, und dann eine bestimmte Frage gestellt. "[Wie viel Forschungsaufwand wird von Stack Overflow-Benutzern erwartet?] (Http://meta.stackoverflow.com/a/261593/128421)" Stattdessen bitten Sie uns um ein Tutorial. Ruby hat mehrere Möglichkeiten, um zu tun, was Sie wollen. Die Dokumentation für die Klasse [Open3] (http://ruby-doc.org/stdlib-2.3.1/libdoc/open3/rdoc/Open3.html) wird helfen, ebenso wie verschiedene Seiten im Internet. –

+0

@theTinMan Vielen Dank für Ihren Kommentar. Ich hatte bisher kein Glück damit, etwas darüber zu finden, wie man ein Programm in beide Richtungen mit einem anderen Programm verbindet. Ich hatte auch keine Ahnung, was ** Jargon ** könnte verwendet werden, um eine solche Situation richtig zu beschreiben. Deshalb habe ich die Frage gestellt. Natürlich ist die Frage, wie viel Forschung erforderlich ist, etwas sehr Subjektives, daher verstehe ich Ihren Grund für die Ablehnung. In jedem Fall hilft dir dein Link zum Open3-Modul schon sehr. Vielen Dank. – Qqwy

+0

Mögliches Duplikat von [Mit Subprozeß in Ruby kommunizieren] (http://stackoverflow.com/questions/27590702/communicate-with-subprocess-in-ruby) –

Antwort

2

, die ganz einfach ist mit IO.popen

handler = IO.popen("bash","w+") 

handler.puts("whoami") 
puts handler.gets 

handler.puts("date") 
puts handler.gets 

handler.close 

Output zu erreichen:

wrodevlopot:tmp lopot$ ruby test.rb 
lopot 
Sat Oct 1 21:57:42 CEST 2016 

IO.popen gibt einen IO-Handler, Geist, dass wir die subprocess mit w+ öffnen, die Leseeinrichtung und schreiben . Im obigen Beispiel öffnen wir einen bash-Prozess, indem wir den Befehl whoami senden, dann lesen wir daraus und drucken dasselbe für den Befehl date. Sobald wir mit dem Subprozess fertig sind, nennen wir close.

Verwandte Themen