From: Yukihiro Matsumoto Date: 2008-03-03T15:15:12+09:00 Subject: [ruby-list:44717] Re: パイプ経由コマンド実行? まつもと ゆきひろです In message "Re: [ruby-list:44716] Re: パイプ経由コマンド実行?" on Mon, 3 Mar 2008 15:05:58 +0900, "m-morita" writes: |ただ言語使用として合点がいきません。 |より実情に即して例示します。 | require "open-uri" | open("|ruby t.rb","w").write open("http://www.google.co.jp").read # -- (1) | # ... many executions as above | open("|ruby t.rb","w").write("AAAA") | |ここで (1) の終了時点で t.rb にデータがわたってきません(デバッガーで |ステップ実行すればわかります)。 |しかし、この一行で読み書きは完了しています。 |読み書き途中のまま次のスクリプト行に移っていませんし、この行の次へ行っ |てしまうと、実装側もこのI/O が見えなくなっているはずです。(結局、インタ |ープリタ終了時に吐き出されるようですが,,,) Rubyにはopen()されたものがもう使われないということを知る手段 がありませんから、「ここでフラッシュするべきだ」という判断を 行うすべがありません。むやみにフラッシュすると今度はIO性能の 低下を引き起こしますし。 となると明示的にクローズする open("|ruby t.rb","w"){|f|f.write open("http://www.google.co.jp").read} と書いていただくのがよいのではないかと思います。7文字ほど増 えちゃいますが。