next up previous contents index
Search Next: Fehlerbehandlung bei Up: Variablen, Blöcke und Iteratoren Previous: Dateien beschreiben   Contents   Index

Pipelines

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


\epsfig{height=36pt,file=images/chan.eps}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
\epsfig{height=10pt,file=images/ruby.eps}



(C) 2002 by dpunkt.de, Armin Roehrl, Stefan Schmiedl, Clemens Wyss 2002-01-20