Mit popen kann man die Standardein- und -ausgaben zweier Programme
miteinander verbinden:
IO.popen("grep FOO foo.txt") do |pipe|
pipe.each do |line|
# ...
end
end
Dabei wartet Ruby, bis der grep-Befehl beendet worden ist, bevor dessen Ausgabe eingelesen wird.
Ein anderes Beispiel ist das auf Unix-Systemen oft praktizierte Verfahren, etwas zu Papier zu bringen:
prntr = IO.popen("lpr", "a")
prntr.print "This is output."
prntr.close
Asynchrone Pipes sind ebenfalls möglich, wenn
man mit Prozessen (siehe Kapitel 13)
arbeitet. Das folgende Beispiel in Unix-Tradition zeigt, wie aus einem
Ruby-Programm heraus gnuplot aufgerufen wird, um ein
Diagramm zu erzeugen, welches wiederum mit xv angezeigt wird.
Das Skript wird fortgeführt, nachdem
der Benutzer das xv-Fenster geschlossen hat.
cmd = "gnuplot | xv -"
fork {
IO.popen(cmd,"w") { |f|
f.puts "..." # gnuplot-Daten
}
}
puts "warte auf xv ..."
Process.wait