「一時ファイルを作らずにスクリプトで生成した文字列を外部コマンドに渡す方法」なのですが、個人的にはGraphvizのdotコマンドでグラフをpng形式で保存するプログラムを書く機会があったときにこれについて調べました。ということで、以下で説明している例ではコマンドはdot
コマンドになります。ですが標準入力を受け取るタイプのコマンドならば、インプットとして例えばfoo.in
があってa.rb
が<cmd>
が受け付ける形式にfoo.in
を変換して標準出力するものとしたとき、./a.rb foo.in| <cmd>
みたいにしたり、./a.rb foo.in > tmp.in && cat tmp.in | <cmd>
みたいなことは必要無いことが分かると思います。
入力が手で書かれたdotファイルであればdot -Tpng -o image.png < tmp.dot
とすれば画像ファイルはできあがります(ドットファイルを標準入力としてリダイレクトせず、つまり'<'が無くても画像ファイルは生成されます)。ですがもともとの入力が別の形式だった場合は、それをドット言語で書かれた文字列に何らかのスクリプト言語で変換し、dotコマンドに渡すことになると思います。このとき、一時ファイルを作っても良いのですが、それは結局ゴミなので、一時ファイルを作らずに画像ファイルを生成する方法を調べました。結論としては、dotファイルは標準入力を受け付けるのでpopenを使えば一時ファイルは不要です。以下がrubyで書いた例です(Parser#dotfileは読み込んだファイルをdot言語に変換するメソッドとします)。
def white_graph(path, ext)
p = Parser.new
p.parse(IO.read(path))
fn = File.basename(path, ext)
IO.popen("dot -Tpng -o ./images/#{fn}.png", "r+") do|io|
io.puts p.dotfile
end
end