ふと気がついたのですが、FileUtils.copy_stream は ARGF を受け付けないようです。

% ruby -rfileutils -e 'FileUtils.copy_stream(ARGF, STDOUT)' /dev/null
/home/akr/ruby/lib/ruby/1.9/fileutils.rb:446:in `fu_copy_stream0': undefined method `sysread' for ARGF:Object (NoMethodError)
        from /home/akr/ruby/lib/ruby/1.9/fileutils.rb:440:in `copy_stream'
        from -e:1

ドキュメントには

  #
  # Copies stream +src+ to +dest+.
  # Both of +src+ and +dest+ must be a IO.
  #

とあり、ARGF は IO ではないのでそれはそういうものなのかもしれませんが、
意外に思いました。

duck type な考え方でいえば、ARGF が sysread を持っていないのだからしか
たがないという見方もあるのですが、read を持っていれば受け付けてくれて
もいいんじゃないだろうかと感じたのですが、どうでしょう?

なお、ARGF が sysread を持つべきだという見方も考えられるのですが、
sysread は system call 直結というイメージがあって、ARGF につけるのは
ちょっと変なように感じます。
-- 
[田中 哲][たなか あきら][Tanaka Akira]