variable $stdin

$stdin -> object[permalink][rdoc][edit]

標準入力です。

自プロセスの標準入力をリダイレクトしたいときは $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 はグローバルスコープです。