Externe Programme starten

Du bist hier: Hinterkattentuffel - Ruby - Externe Programme starten
Prev: Windows virtuelles Dateisystem

Es gibt eine Reihe von Möglichkeiten, von Ruby aus externe Programme auszuführen. Ich nutze dieses Feature z. B., um an sich unfertige Ruby-Programme schnell einer ersten Benutzung zuzuführen.

Ruby hat das Potential, für mich Tasks zu erledigen, die ich früher über die Bash, Unix-Filter, Awk, Perl oder gar in C realisiert hätte. Bis man als Ruby-Experte im Grunde alles nur noch in Ruby erledigt, dauert es jedoch eine Weile und da ist es pragmatisch, das gewohnte Handwerkszeug nicht von heute auf morgen über Bord zu werfen. Und auch in der Windows-Familie gibt es Tools, deren Einsatz für den Anfang Arbeit spart:

IRB> system 'find /?'
Sucht in einer oder mehreren Dateien nach einer Zeichenfolge.
...
=> true
Der Fehlercode landet in $?.
IRB> system 'bla'; puts "Fehlercode[ #{$?}]"
Fehlercode[ -1]
=> nil

Will man gleichzeitig aus dem Ruby-Pogramm aussteigen, verwendet man exec. Ein Beispiel liefert ri exec.

Kniffliger wird's, wenn der Output des Programms in Ruby verwendet werden soll. Im Prinzip leisten das Backquotes, aber im Gegensatz zu "system" funktionieren Backquotes nicht für DOS-Kommandos, also Programme mit der Endung .COM, etwa das Kommando tree. Hierbei muss dann der Kommandointerpreter vorgeschaltet werden:

IRB:> tmp = `cmd /c tree`; puts tmp
Auflistung der Ordnerpfade für Datenträger FESTPLATTE
...
=> nil

Damit der Fehleroutput auch über die Standardausgabe läuft und dann in der Variable landet, muss man ihn umleiten:

IRB:> tmp = `cd xxx`; puts "[#{tmp}]"
Das System kann den angegebenen Pfad nicht finden.
[]
=> nil
IRB> tmp = `cd xxx 2>&1`; puts "[#{tmp}]"
[Das System kann den angegebenen Pfad nicht finden.
]
=> nil

Wer noch mehr Kontrolle benötigt, sollte sich mit Pipes beschäftigen. Im simpelsten Fall bieten sie ähnliche Funktionalität wie system und Backquotes, aber Pipes können auch bidirektionale Kommunikation etablieren. Einen ersten Überblick liefert

CMD:>ri IO#popen

Eine mögliche Verwendung von Pipes demonstriert auch das in der Installation enthaltene Beispielprogramm C:\ruby\samples\FXRuby\inputs.rbw.

Next: Bloecke