Ruby 1.9.2 リファレンスマニュアル > ライブラリ一覧 > library _builtin > module Kernel > $stdin

variable $stdin

$stdin

標準入力です。

自プロセスの標準入力をリダイレクトしたいときは $stdin に代入すれば十分です。

# 標準入力の入力元 /tmp/foo に変更
$stdin = File.open("/tmp/foo", "w")
gets               # 入力する
$stdin = STDIN     # 元に戻す

ただし、Kernel.#gets など、特定の組み込みメソッドは $stdin オブジェクトにメソッドを転送して実装されています。 従って、Kernel.#gets などが正しく動作するには、 $stdin オブジェクトに代入したオブジェクトが以下のメソッドを 正しく実装していなければいけません。

gets, readline, readlines, getc, readchar, tell, seek,
pos=, rewind, fileno, to_io, eof, each_line, each_byte,
binmode, closed?

例:

$stdin = Object.new
def $stdin.gets
  "foo"
end
p gets()  # => "foo"

自プロセスだけでなく、子プロセスの標準入力もリダイレクトしたいときは 以下のように IO#reopen を使います。

$stdin.reopen("/tmp/foo")

また、リダイレクトしたあと 出力先をまた元に戻したい場合は以下のようにします。

stdin_old = $stdin.dup       # 元の $stdin を保存する
$stdout.reopen("/tmp/foo")   # $stdin を /tmp/foo にリダイレクトする
gets                         # /tmp/foo から入力
$stdin.reopen stdin_old      # 元に戻す

$stdin はグローバルスコープです。