Gibt es eine Möglichkeit, Befehlszeilenbefehle über Ruby auszuführen? Ich versuche, ein kleines Ruby-Programm zu erstellen, das über Befehlszeilenprogramme wie "screen", "rcsz" usw. wählt und empfängt / sendet.
Es wäre großartig, wenn ich all dies mit Ruby verknüpfen könnte (MySQL-Backend usw.)
Antworten:
Ja. Es gibt verschiedene Möglichkeiten:
ein. Verwenden Sie
%x
oder '`':Diese Methoden geben das stdout zurück und leiten stderr zum Programm um.
b. Verwendung
system
:Diese Methode wird zurückgegeben,
true
wenn der Befehl erfolgreich war. Es leitet alle Ausgaben an das Programm weiter.c. Verwendung
exec
:Dadurch wird der aktuelle Prozess durch den vom Befehl erstellten ersetzt.
d. (Rubin 1.9) verwenden
spawn
:Diese Methode wartet nicht auf das Beenden des Prozesses und gibt die PID zurück.
e. Verwendung
IO.popen
:Diese Methode gibt ein
IO
Objekt zurück, das die Eingabe / Ausgabe der neuen Prozesse darstellt. Es ist derzeit auch die einzige mir bekannte Möglichkeit, die Programmeingabe zu geben.f. Verwenden Sie
Open3
(ab 1.9.2)Open3
verfügt über mehrere andere Funktionen, um expliziten Zugriff auf die beiden Ausgabestreams zu erhalten. Es ist ähnlich wie Popen, gibt Ihnen aber Zugriff auf stderr.quelle
io = IO.popen 'cat > out.log', 'r+'
; schreibt die Ausgaben des Befehls in "out.log"FileUtils
[ ruby-doc.org/stdlib-1.9.3/libdoc/fileutils/rdoc/FileUtils.html] ?Es gibt verschiedene Möglichkeiten, Systembefehle in Ruby auszuführen.
Wenn Sie jedoch tatsächlich Ein- und Ausgaben mit dem Befehl stdin / stdout ausführen müssen, sollten Sie sich wahrscheinlich die
IO::popen
Methode ansehen , die diese Funktion speziell bietet.quelle
quelle
Ja, dies ist sicherlich machbar, aber die Implementierungsmethode hängt davon ab, ob das betreffende "Befehlszeilen" -Programm im "Vollbild" - oder im Befehlszeilenmodus ausgeführt wird. Für die Befehlszeile geschriebene Programme neigen dazu, STDIN zu lesen und in STDOUT zu schreiben. Diese können mithilfe der Standard-Backticks-Methoden und / oder System- / Exec-Aufrufe direkt in Ruby aufgerufen werden.
Wenn das Programm im "Vollbild" -Modus wie Bildschirm oder vi arbeitet, muss der Ansatz anders sein. Für Programme wie dieses sollten Sie nach einer Ruby-Implementierung der "Expect" -Bibliothek suchen. Auf diese Weise können Sie skripten, was Sie auf dem Bildschirm erwarten und was gesendet werden soll, wenn diese bestimmten Zeichenfolgen auf dem Bildschirm angezeigt werden.
Dies ist wahrscheinlich nicht der beste Ansatz, und Sie sollten sich wahrscheinlich ansehen, was Sie erreichen möchten, und die entsprechende Bibliothek / das Juwel finden, um dies zu tun, anstatt zu versuchen, eine vorhandene Vollbildanwendung zu automatisieren. Als Beispiel behandelt " Benötigen Sie Unterstützung bei der Kommunikation über serielle Schnittstelle in Ruby " die Kommunikation über serielle Schnittstelle , ein Vorläufer für das Wählen, wenn Sie dies mit den von Ihnen genannten spezifischen Programmen erreichen möchten.
quelle
Die am häufigsten verwendete Methode ist
Open3
Hier ist meine Code-bearbeitete Version des obigen Codes mit einigen Korrekturen:quelle